C++ 括号内初始值设定项列表的使用无效

C++ 括号内初始值设定项列表的使用无效,c++,c++11,initializer-list,C++,C++11,Initializer List,我想初始化Foo类 class Foo { public: struct MyStruct { uint8 i; char c; }; Foo(MyStruct args...){ }; }; 但我有个错误 错误:括号内初始值设定项列表的使用无效 如果我对变量执行此操作,则不会出现错误 Foo::MyStruct a1 = {1, 'a'}; Foo::MyStruct b2 = {2, 'b'}; auto test =

我想初始化Foo类

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

    Foo(MyStruct args...){

    };
};
但我有个错误

错误:括号内初始值设定项列表的使用无效

如果我对变量执行此操作,则不会出现错误

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

auto test = Foo(a1, b2);

但是我不喜欢这样,我想把代码压缩成一个紧凑的

您需要显式地声明要传递给构造函数的类型。汇编如下:

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

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

什么是
MyStruct参数…
?注意
Foo(MyStruct参数…
不是一个C++风格的变量函数,它接受零个或多个
MyStruct
参数。这是一个C风格的变量函数,它包含一个
MyStruct
,然后是以下任何参数列表,只能使用
va_arg
访问这些参数。现在没有时间给出正确的答案,但您似乎想要
Foo(std::initializer\u list args)
。为什么在不使用初始化列表时将其标记为
初始化列表
。@Fulrus在这种情况下,不清楚您在问什么。请编辑您的问题以包含相关信息。也可以考虑张贴另一个。如果构造函数显式地接受了一个容器:<代码> MyStult,它们不需要指定任何元素的类型。
auto test = Foo(
  Foo::MyStruct{1, 'a'},
  Foo::MyStruct{2, 'b'}
);