2013-10-04 155 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

相關問題