1

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

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&&'

但这没关系:

int main(){
    terminator root = {0, "", NULL};
    root = *(new terminator);
    root.id=0;
    root.type="";
    root.next=NULL;
}

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

4

3 回答 3

3

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

在第二种情况下,您试图分配给已声明的变量,除非您的编译器支持复合文字作为扩展,否则这将不起作用。(即使是这样,你也需要写

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

使其真正发挥作用。)

如果您可以使用 C++11(您似乎可以使用),您还可以利用名为“初始化器列表”的新功能,该功能具有类似的语法:

root = terminator{ 0, "", NULL };
于 2013-03-19T09:03:15.907 回答
2

您需要告诉编译器 RHS 的类型为terminator

root = terminator{0, "", NULL};
于 2013-03-19T09:02:45.397 回答
1

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

root = terminator{0, "", nullptr};
于 2013-03-19T09:04:06.433 回答