【问题标题】:invalid use of brace-enclosed initializer list无效使用大括号括起来的初始值设定项列表
【发布时间】:2017-10-26 11:49:03
【问题描述】:

我要初始化 Foo 类

class Foo {
public:
    struct MyStruct {
        uint8 i;
        char c;
    };

    Foo(MyStruct args...){

    };
};

但我遇到了错误

错误:使用大括号括起来的初始化列表无效

auto test = Foo(
    {1, 'a'},
    {2, 'b'}
);

如果我对变量执行此操作,则没有错误

Foo::MyStruct a1 = {1, 'a'};
Foo::MyStruct b2 = {2, 'b'};

auto test = Foo(a1, b2);

但我对此不太满意,我想让代码紧凑

【问题讨论】:

  • 什么是MyStruct args...
  • 注意 Foo(MyStruct args...) 不是一个 C++ 风格的可变参数函数,它接受零个或多个 MyStruct 参数。这是一个 C 风格的可变参数函数,接受一个 MyStruct,然后是任何以下参数列表,只能使用 va_arg 访问。
  • 现在没时间给出正确答案,但您似乎想要Foo(std::initializer_list<MyStruct> args);
  • 为什么你在不使用的时候把它标记为initializer-list..?
  • @Fulrus 在这种情况下,不清楚你在问什么。请编辑您的问题以包含相关信息。或者考虑发布另一个。

标签: c++ c++11 initializer-list


【解决方案1】:

您需要明确说明要传递给构造函数的类型。以下编译:

auto test = Foo(
  Foo::MyStruct{1, 'a'},
  Foo::MyStruct{2, 'b'}
);

请注意 aschepler 的评论,尽管 Foo(MyStruct args...) 不是 C++ 风格的可变参数函数。因此,如果您真的要尝试使用构造函数参数做一些事情,您可能会遇到麻烦。换句话说:你会遇到麻烦:)。

【讨论】:

  • 如果构造函数显式采用MyStruct的容器,则不需要为任何元素指定类型。
猜你喜欢
  • 2011-05-31
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多