在下面的代码片段中,当方法Data::setValue(int, int)被声明为虚函数时,我收到了编译器错误:
编译器(g++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3)给出的错误信息如下:
struct.cpp:19:14: error: member 'Data ThreadMessage::content::d' with constructor not allowed in union struct.cpp:19:14: error: member 'Data ThreadMessage::content::d' with copy assignment operator not allowed in union
这组编译器错误让我大吃一惊。在实际代码中,我有更多属性和函数。因此,我开始查找我在哪里放了bloody operator=()和constructor,但是我没有在
我知道如果将Data :: setValues设置为非虚拟,则我的问题就会消失。但是为什么结构体Data有一个构造函数?C ++中什么时候会有结构体构造函数?为什么当我把
struct Data{
int ma;
int mb;
virtual void setValues(int a, int b){
ma = a;
mb = b;
}
};
struct ThreadMessage {
enum type {
DATA
};
type msg_type;
union content {
Data d;
int a;
}content;
};
编译器(g++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3)给出的错误信息如下:
struct.cpp:19:14: error: member 'Data ThreadMessage::content::d' with constructor not allowed in union struct.cpp:19:14: error: member 'Data ThreadMessage::content::d' with copy assignment operator not allowed in union
这组编译器错误让我大吃一惊。在实际代码中,我有更多属性和函数。因此,我开始查找我在哪里放了bloody operator=()和constructor,但是我没有在
struct Data
中写它们。我知道如果将Data :: setValues设置为非虚拟,则我的问题就会消失。但是为什么结构体Data有一个构造函数?C ++中什么时候会有结构体构造函数?为什么当我把
virtual void Data :: setValues(int,int)
变成非虚拟时,编译错误会消失?
virtual void Data::setValues(int, int)
声明为void Data::setValues(int, int)
时,编译器错误消失了。这里存在一些显著的差异,这就是我的问题所在。 - hetepeperfan