2013-05-11 11 views
5

capisco cosa call to implicitly-deleted default constructor mezzi, ma non capisco il motivo per cui io sono sempre qui:rendimenti struct All-pubblici chiamata a implicitamente eliminati predefinita costruttore

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

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

Poi ho:

TransformData data; //generates error noted in title

Non dovrebbe un POD avere un semplice costruttore predefinito fornito dal compilatore?

+5

Il codice viene compilato correttamente se si rimuove 'vec3'. Qual è il tipo di 'vec3'? – iammilind

+0

'vec3' è un typedef per un Vector3 come definito con il proprio costruttore di default:' modello struct Vector3 { Vector3() {} '' così dato vec3' ha un costruttore di default, non so perché questo dovrebbe essere un problema con la mia struttura sopra – johnbakers

+2

@Fellowshee: non puoi attaccare un non POD in un 'unione'. – jxh

risposta

6

Come già accennato, Vector3<T> è un tipo non-POD. Sulla base delle informazioni nella tua domanda, se si sta utilizzando C++ 11, si può fare un tipo di 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; 

In questo modo, non avrete alcun problema che attaccano in un sindacato e conservazione il costruttore predefinito.

+0

funziona! grazie, ho cambiato la risposta corretta – johnbakers

2

Il codice compila bene senza vec3 translate;.
Come indicato nel commento, il tipo di translate è class Vector3 che è un non POD. Le variabili di dati non POD non sono consentite all'interno di union.
L'errore del compilatore con g ++ dice tutto:

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

E un favore bonus da (ora) più intelligente g ++:

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

Problemi correlati