簡體   English   中英

全公共結構生成調用隱式刪除的默認構造函數

[英]All-public struct yields call to implicitly-deleted default constructor

我理解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不應該有一個由編譯器提供的簡單默認構造函數嗎?

如前所述, 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;

這樣,你就不會有任何問題將它粘在一個聯合中並保持默認的構造函數。

沒有vec3 translate;代碼編譯良好vec3 translate;
正如您在評論中提到的, translate的類型是class Vector3 ,它是非POD。 union內部不允許使用非POD數據變量。
g ++的編譯錯誤說明了一切:

錯誤:成員'Vector3 TransformData :: data_t :: vec3',在union中不允許使用構造函數

從(現在)更聰明的g ++獲得獎勵:

注意:不受限制的聯合僅適用於-std = c ++ 11或-std = gnu ++ 11

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM