工会成员无效

时间:2014-02-23 13:09:05

标签: c++ visual-studio c++11 visual-studio-2013 unions

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中有没有办法支持这种联合(例如编译选项)?或者我应该更改我的代码,如果是这样的话?

4 个答案:

答案 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中的默认构造函数定义文件。您仍会看到条形栏的错误,因为智能感知并不确切知道发生了什么。无论这有什么帮助,您的应用程序仍将编译。