5

意味はわかりcall to implicitly-deleted default constructorますが、なぜここにいるのかわかりません:

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

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

で、〜がある:

TransformData data; //generates error noted in title

POD には、コンパイラによって提供される単純な既定のコンストラクターが必要ではありませんか?

4

2 に答える 2

6

前述のとおりVector3<T>、非PODタイプです。質問の情報に基づいて、C++ 11 を使用している場合は、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;

このようにして、ユニオンに貼り付けてデフォルトのコンストラクターを保持することに問題はありません。

于 2013-05-11T07:48:29.007 に答える
2

コードは、なしで正常にコンパイルされますvec3 translate;
コメントで述べたように、のタイプはtranslateclass Vector3PODです。非 POD データ変数は、 内では使用できませんunion
g++ のコンパイラ エラーがすべてを示しています。

エラー: コンストラクターを持つメンバー 'Vector3 TransformData::data_t::vec3' は共用体では許可されていません

そして、(現在)よりスマートなg ++からのボーナスの恩恵:

注: 無制限の共用体は -std=c++11 または -std=gnu++11 でのみ使用可能

于 2013-05-11T07:44:00.637 に答える