2013-10-04 100 views
0

此代码无法编译。我在指定的位置得到“预期的{或,”。 (Xcode 5,所以它是一个相当完整的C++ 11编译器。)命名联合成员的构造函数初始化

有没有办法在构造函数初始化列表中初始化嵌套union的成员,还是只需要在构造函数体?

class Foo 
{ 
public: 
    Foo(): m_bar.m_x(123) { } 
private:  //^error here 
    union 
    { 
     union 
     { 
      int m_x; 
      float m_y; 
     } 
     m_pod; 
     std::string m_name; 
    }; 
}; 
+5

什么'm_bar'?没有这样的成员。 –

+0

http://stackoverflow.com/questions/13056366/can-i-initialize-a-union-in-a-mem-initializer –

+2

这段代码声明了一个匿名'union',但选择不使用它。 –

回答

6

这里是一个重写版本的代码固定的各种问题:

  1. 它给人的嵌套union SA构造:像任何其他类类型,union的需要一个构造函数,如果你不想分开初始化它们。
  2. 它给嵌套union bar析构函数作为它的析构是否则delete d由于std::string构件否则(和它需要处理该构件可以是std::string类型此代码没有的情况)。在标准的有关条款是12.4 [class.dtor]段落5:

    一类X A拖欠析构函数被定义为已删除,如果:

    - X is a union-like class that has a variant member with a non-trivial destructor, 
    - ... 
    
  3. 它还包括缺少的头<string>

这是代码:

#include <string> 
class Foo 
{ 
public: 
    Foo(): m_bar(123) { } 
private: 
    union bar 
    { 
     bar(int x): m_pod(x) {} 
     bar(float y): m_pod(y) {} 
     ~bar() {} 
     union baz 
     { 
      baz(int x): m_x(x) {} 
      baz(float y): m_y(y) {} 
      int m_x; 
      float m_y; 
     } 
     m_pod; 
     std::string m_name; 
    } m_bar; 
}; 
+0

谢谢!出于某种原因,建设者和工会根本没有想到...... – terriblememory

相关问题