2016-04-04 9 views
0

私はC++ 11でコンパイルしながら、これを持っている:typedefでconst int classメンバを使用していますか?

class A{ 
    const uint32_t X = 5; 
    typedef std::array<B, X> ARRAY; 

}; 

と私は、エラーメッセージ

非静的データメンバの不正使用を取得します。

これは静的なものではありません。私はこのために動的なリンクの問題があり、イニシャライザリストを使用したくないからです。これらの「マジックナンバー」は非常に明確ですヘッダーの上部。

+2

あります。 –

+2

'static constexpr' –

+0

静的で動的なリンクを使用しているためにバグが発生したため、静的を使用したくありません..... – user997112

答えて

4

これを行うのは非常に昔ながらの方法は#DEFINE X 5;にある、彼らはコードレビューセッションで手首に平手打ちをしない限り、誰もそれ以上にこれを使用しません。これを行うための

かなり昔ながらの方法では、これが最良の事前C++ 11の方法である私の意見ではenum {X = 5};を使用することです。これを行うための

現代方法はXコンパイル時評価可能であることを確認してくださいstatic constexpr uint32_t X = 5;

これらのすべての方法を使用することです。

+0

'constexpr'メンバーは' static'でなければなりませんか? –

+0

@PiotrSkotnicki:あなたは正しいです。 – Bathsheba

+0

それほど古いものではないMS Visual Studioのバージョンは 'constexpr'をサポートしていません。これらのバージョンとの互換性が必要な場合は代わりに 'const'を使用することができます。 – anatolyg

0

別のアプローチは、 `静的const`

class A{ 
    enum Array_Size : uint32_t { X = 5 }; 
    typedef std::array<B, X> ARRAY; 

}; 
+0

あなたは 'enum'の名前を作る必要はありません。単純な構文 'enum:uint32_t {...}'で十分です。 – anatolyg

関連する問題