2016-03-03 31 views
40

このコードは私に不完全なタイプエラーを与えています。 問題は何ですか?クラスにはの静的メンバーインスタンスが含まれていますか? 同じ結果を達成する方法はありますか?クラスに静的なconstexprメンバーのインスタンスはありませんか?

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static constexpr Size big = { 480, 240 }; 

    static constexpr Size small = { 210, 170 }; 

private: 

    Size() = default; 
}; 
+4

あなたは 'constexpr'静的メンバーについて具体的に質問していますか? –

+0

@PiotrSkotnickiはい。とにかくキーワードを削除しても機能しません。 – nyarlathotep108

+1

キーワードを削除すると、既に完全な型のときにクラスを初期化することができます –

答えて

38

同じ結果を得る方法はありますか? "同じ結果" と

は、あなたが特に Size::bigSize::smallconstexpr -nessを意図していますか?その場合、これは十分近いかもしれません:

struct Size 
{ 
    const unsigned int width = 0; 
    const unsigned int height = 0; 

    static constexpr Size big() { 
     return Size { 480, 240 }; 
    } 

    static constexpr Size small() { 
     return Size { 210, 170 }; 
    } 

private: 

    constexpr Size() = default; 
    constexpr Size(int w, int h) 
    : width(w),height(h){} 
}; 

static_assert(Size::big().width == 480,""); 
static_assert(Size::small().height == 170,""); 
58

クラスは、同じタイプの静的メンバを持たせるあります。ただし、クラスは定義の最後まで不完全であり、オブジェクトはと定義されています。は不完全な型です。 不完全な型のオブジェクトを宣言し、後でそれが完全な場所(クラス外)に定義することができます。

struct Size 
{ 
    const unsigned int width; 
    const unsigned int height; 

    static const Size big; 
    static const Size small; 

private: 

    Size() = default; 
}; 

const Size Size::big = { 480, 240 }; 
const Size Size::small = { 210, 170 }; 

ここでこれを参照してください。http://coliru.stacked-crooked.com/a/f43395e5d08a3952

をしかし、これは、constexprメンバーのために動作しません。

+1

標準によって禁じられているか、またはコンパイラのバグのために、これが 'constexpr'メンバではうまくいかないと思いますか? – nyarlathotep108

+6

@ nyarlathotep108静的constexprメンバをインラインで初期化する必要があるため、動作しません。 – Brian

関連する問題