Visual Studio中是否有办法处理非平凡的联合。以下代码使用g++ -std=c++11
正常运行,但VS抱怨:
无效的联盟成员 - 类“Foo”有一个不允许的成员函数
代码如下:
struct Foo {
int value;
Foo(int inV = 0) : value(inV) {}
};
union CustomUnion {
CustomUnion(Foo inF) : foo(inF) {}
CustomUnion(int inB) : bar(inB) {}
int bar;
Foo foo;
};
int main() {
CustomUnion u(3);
return 0;
}
Visual Studio中有没有办法支持这种联合(例如编译选项)?或者我应该更改我的代码,如果是这样的话?
答案 0 :(得分:7)
我同意@Shafik Yaghmour,但有一个简单的解决方法
只需将foo
成员加入unnamed struct
即可:
union CustomUnion {
struct{
Foo foo;
};
int bar;
};
答案 1 :(得分:3)
Visual Studio does not support unrestricted unions这是一个 C ++ 11 功能,允许联合包含非POD 类型,在您的情况下 Foo 有一个非平凡的构造函数,因为你已经定义了一个。
我没有看到任何引用说明Visual Studio何时支持这一点,所以看起来你不会像在Visual Studio中那样工作。虽然似乎有many who do want this feature supported。
我能看到的唯一方法就是从 Foo 中删除用户定义的构造函数。这意味着在 CustomUinon 构造函数中手动初始化foo
。
一篇好的参考文章将是:C++11 Standard Explained: 1. Unrestricted Union 。
答案 2 :(得分:1)
如msdn所述,union只访问成员: 1)没有任何构造函数或析构函数的类类型, 2)静态成员, 3)没有用户定义的赋值操作的类类型(override =)。
答案 3 :(得分:0)
我收到了同样的错误,但我的情况可能有所不同。事实证明联盟正在寻找默认的构造函数。
所以在我的课堂上我必须这样做:
struct Foo
{
union
{
Bar bar; // intellisense will still show error, but you can ignore it.
};
};
在 Bar class 中,不是创建传统的默认构造函数Bar();
并定义它,而是将其更改为Bar() = default;
并删除.cpp中的默认构造函数定义文件。您仍会看到条形栏的错误,因为智能感知并不确切知道发生了什么。无论这有什么帮助,您的应用程序仍将编译。