我在我的程序中使用以下结构。
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;
}
为什么会这样?有办法解决它吗?
答案 0 :(得分:3)
在第一种情况下,您初始化结构。
在第二种情况下,您尝试赋予到已声明的变量,除非您的编译器支持复合文字作为扩展名,否则将无效。 (即使它确实如此,你也需要写
root = (terminator){ 0, "", NULL };
实际上让它发挥作用。)
如果您可以使用C ++ 11 (您可能会这样做),您还可以利用名为“初始化列表”的新功能,该功能具有类似的语法:
root = terminator{ 0, "", NULL };
答案 1 :(得分:2)
您需要告诉编译器RHS的类型为terminator
:
root = terminator{0, "", NULL};
答案 2 :(得分:1)
行terminator root = {0, "", NULL};
确实聚合初始化,这是一种在没有构造函数的情况下允许的构造形式。 =
并不意味着任务。在C ++ 11中,您可以使用大括号语法来构造类型为terminator
的匿名临时对象,然后您可以将其分配给root
:
root = terminator{0, "", nullptr};