2013-10-04 4 views
0

Этот код не компилируется. Я получаю «Ожидаемый {или» в указанном пункте. (Xcode 5, так что это достаточно полный компилятор C++ 11.)Инициализация конструктора именованного члена объединения

Есть ли способ инициализировать член вложенного объединения в списке инициализаторов конструктора или просто нужно сделать это в теле конструктора ?

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 s нужен конструктор, если вы не хотите для их инициализации отдельно.
  2. Это дает вложенную union bar деструктор в качестве деструктора иначе delete d вследствие std::string элемента в противном случае (и это должно иметь дело с ситуацией, что элемент может быть типа std::string, который этот код не). Соответствующий пункт в стандарте является 12,4 [class.dtor] пункт 5:

    дефолт деструктор для класса X определяется как удаляется, если:

    - 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

Смежные вопросы