我有以下课程:
oo
class Foo {
public:
struct Bus {
SPIClass *spi;
const uint8_t pin;
};
constexpr Foo(SPIClass *spi, uint8_t csPin) :
_bus({.spi{spi}, .pin{csPin}}) {}
protected:
const Bus _bus;
};
由于const成员_bus,我使用构造函数中的初始化列表初始化了它们。但是以某种方式无法识别它,并引发以下编译错误:
error: no matching function for call to 'Foo::Bus::Bus(<brace-enclosed initializer list>)'
_bus({.spi{spi}, .pin{csPin}}) {}
^
note: candidate: 'constexpr Foo::Bus::Bus(const TMC::Motionctrl::Bus&)'
struct Bus {
^~~
note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const Foo::Bus&'
note: candidate: 'constexpr Foo::Bus::Bus(Foo::Bus&&)'
note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'Foo::Bus&&'
error: member 'Foo::_bus' must be initialized by mem-initializer in 'constexpr' constructor
_bus({.spi{spi}, .pin{csPin}}) {}
^
我猜第二个错误是因为初始化失败,但是我找不到错误。我正在使用GCC(GNU Arm嵌入式工具链),构建命令参数是
\ packages \ STM32 \ tools \ arm-none-eabi-gcc \ 8.2.1-1.7 / bin / arm-none-eabi-g ++“ -mcpu = cortex-m3 -mthumb” @E:\ xxx \ Release / sketch / build_opt.h” -c -Os -Wall -Wextra -std = gnu ++ 14 -ffunction-sections -fdata-sections -nostdlib -fno-threadsafe-statics --param max-inline-insns-single = 500 -fno- rtti -fno-exceptions -fno-use-cxa-atexit -MMD“-
谢谢!
指定的初始化程序的GNU扩展仅支持该.designator = arg
格式,而不支持.designator{arg}
C ++ 20中引入的格式。在更高版本的gcc中,括号初始化程序形式也被接受为gcc扩展。
解决方法是不使用扩展名或使用equals初始化程序:
_bus({.spi = spi, .pin = csPin}) // GNU extension or C++20
_bus{spi, csPin} // C++11
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句