C++ C++;实例化结构错误,为什么不';这不允许吗?

C++ C++;实例化结构错误,为什么不';这不允许吗?,c++,mingw,C++,Mingw,我正在我的程序中使用以下结构 struct terminator{ int id; string type; union{ terminator *next; int empty; }; }; 我主要有以下代码: int main(){ terminator root = {0, "", NULL}; root = {0, "", NULL}; //NOT ALLOWED WHY? Trying to set to

我正在我的程序中使用以下结构

struct terminator{
    int id;
    string type;
    union{
        terminator *next;
        int empty;
    };
};
我主要有以下代码:

int main(){
    terminator root = {0, "", NULL};
    root = {0, "", NULL}; //NOT ALLOWED WHY? Trying to set to its original value.
}
这将显示以下错误消息:

g++ lab8.cc -std=c++11
lab8.cc: In function 'int main()':
lab8.cc:78:21: error: no match for 'operator=' in 'root = {0, "", 0}'
lab8.cc:78:21: note: candidates are:
lab8.cc:6:8: note: terminator& terminator::operator=(const terminator&)
lab8.cc:6:8: note:   no known conversion for argument 1 from '<brace-enclosed in
itializer list>' to 'const terminator&'
lab8.cc:6:8: note: terminator& terminator::operator=(terminator&&)
lab8.cc:6:8: note:   no known conversion for argument 1 from '<brace-enclosed in
itializer list>' to 'terminator&&'

为什么会这样?有什么办法可以绕过它吗?

您需要告诉编译器RHS属于
终止符类型:

root = terminator{0, "", NULL};

您需要告诉编译器RHS的类型为
终止符:

root = terminator{0, "", NULL};

在第一种情况下,您正在初始化结构

在第二种情况下,您正试图赋值给已声明的变量,除非编译器支持将复合文本作为扩展,否则将无法工作。(即使是这样,你也需要写作

root = (terminator){ 0, "", NULL };
让它真正起作用。)

如果您可以使用C++11(看起来是这样),您还可以利用名为“初始值设定项列表”的新功能,该功能具有类似的语法:

root = terminator{ 0, "", NULL };

在第一种情况下,您正在初始化结构

在第二种情况下,您正试图赋值给已声明的变量,除非编译器支持将复合文本作为扩展,否则将无法工作。(即使是这样,你也需要写作

root = (terminator){ 0, "", NULL };
让它真正起作用。)

如果您可以使用C++11(看起来是这样),您还可以利用名为“初始值设定项列表”的新功能,该功能具有类似的语法:

root = terminator{ 0, "", NULL };

终止符根={0,“,NULL}进行聚合初始化,这是在没有构造函数的情况下允许的一种构造形式。那里的
=
实际上并不意味着赋值。在C++11中,您可以使用大括号语法构造一个类型为
terminator
的匿名临时对象,然后将其分配给
root

root = terminator{0, "", nullptr};

终止符根={0,“,NULL}进行聚合初始化,这是在没有构造函数的情况下允许的一种构造形式。那里的
=
实际上并不意味着赋值。在C++11中,您可以使用大括号语法构造一个类型为
terminator
的匿名临时对象,然后将其分配给
root

root = terminator{0, "", nullptr};

@H2CO3OP使用的是C++11编译器。哦,我明白了。没有注意到
-std=c++11
标志。我的错。@H2CO3 OP正在使用C++11编译器。哦,我明白了。没有注意到
-std=c++11
标志。我的错。与这个问题没有直接关系,但在C++11中,
NULL
的使用被弃用,取而代之的是
nullptr
@Gorpik,这很有趣。谢谢你的信息!与这个问题没有直接关系,但是在C++11中,
NULL
的使用被弃用,取而代之的是
nullptr
@Gorpik,这很有趣。谢谢你的信息!