2013-05-11 12 views
5

rozumiem co call to implicitly-deleted default constructor środki, ale nie rozumiem, dlaczego ja dostaję go tutaj:plony struct All-publiczne wezwanie do niejawnie usuniętych domyślnego konstruktora

 struct TransformData{ 
     enum type_t{ 
      kDelay=0, 
      kScale, 
      kTranslate, 
      kRotation 
     }type; 

     union data_t{ 
      double delaySeconds; 
      float scale; 
      float rotation; 
      vec3 translate; 
     }data; 
    }; 

Wtedy mam:

TransformData data; //generates error noted in title

Czy dany POD nie powinien mieć domyślnego konstruktora dostarczonego przez kompilator?

+5

Kod kompiluje dobrze, jeśli usuniesz 'vec3'. Jaki jest typ 'vec3'? – iammilind

+0

'vec3' jest typedef do Vector3 jak zdefiniowano z własnym domyślnym konstruktorem:' template struct Vector3 { Vector3() {} 'tak, ponieważ' vec3' ma domyślny konstruktor, nie wiem dlaczego to powinien być problem z moją strukturą powyżej – johnbakers

+2

@Fellowshee: Nie możesz przykleić non-POD do "union". – jxh

Odpowiedz

6

Jak już wspomniano, Vector3<T> jest typu non-POD. Na podstawie informacji zawartych w swoje pytanie, jeśli używasz C++ 11, można dokonać jej typ POD:

template <typename T> 
struct Vector3 { 
    Vector3() = default; // <--- instead of { } 
}; 

typedef Vector3<float> vec3; 

struct TransformData { 
    union data_t { 
    double delaySeconds; 
    float scale; 
    float rotation; 
    vec3 translate; 
    } data; 
}; 

TransformData data; 

ten sposób, że nie będzie miał żadnych problemów trzymać go w unii i utrzymywania domyślny konstruktor.

+0

działa! dzięki, zmieniłem to jako poprawną odpowiedź. – johnbakers

2

Kod kompiluje dobrze bez vec3 translate;.
Jak wspomniano w komentarzu, typ translate jest class Vector3, który jest non-POD. Zmienne danych innych niż POD są niedozwolone wewnątrz union.
Błąd kompilatora z g ++ mówi wszystko:

error: member ‘Vector3 TransformData::data_t::vec3’ with constructor not allowed in union

I przysługę premia z (teraz) mądrzejszy g ++:

note: unrestricted unions only available with -std=c++11 or -std=gnu++11

Powiązane problemy