簡體   English   中英

每個構造函數成員初始化器列表的 const 數據成員的初始化,錯誤:沒有匹配的 function 用於調用

[英]Initialization of const data members per constructor member-initializer list, error: no matching function for call

我有以下 class:

Foo.h

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形式,不支持 C++20 中引入的.designator{arg}形式。 在 gcc 的更高版本中,大括號初始值設定項形式也被接受為 gcc 擴展。

修復只是不使用擴展名或使用等於初始化器:

_bus({.spi = spi, .pin = csPin})  // GNU extension or C++20
_bus{spi, csPin}  // C++11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM