9

私は以下を実装しようとしています:

#include <array>
#include <cstdint>

class Class2
{
};

class Class1
{
public:
    static constexpr uint8_t GetMax() { return 5; }
    static constexpr uint8_t GetMin() { return 0; }
    static constexpr uint8_t GetCount() { return GetMax() - GetMin() + 1; }

private:
    std::array<Class2, Class1::GetCount()> m_classes;
};

しかし、エラーのために動作させることができません:

非型テンプレート引数は定数式ではありません

Xcode 5.0 を使用しています。何か案は?

4

2 に答える 2

2

ここでの問題は、3.3.7 - クラススコープで間接的に説明されています。

typedef int c;
enum { i = 1 };

class X {
    char v[i]; // error: i refers to ::i
               // but when reevaluated is X::i
    int f() { return sizeof(c); } // OK: X::c
    char c;
    enum { i = 2 };
};

この段落では、これについてもう少し説明する必要があります (9.2.2):

クラスは、クラス指定子の最後の } で完全に定義されたオブジェクト型 (3.9) (または完全な型) と見なされます。仕様、および非静的データメンバー用のブレースまたはイコールイニシャライザー (ネストされたクラス内のそのようなものを含む)。それ以外の場合、それ自体のクラス メンバー仕様内では不完全であると見なされます。

その時点std::array<Class2, Class1::GetCount()>で、関数本体、デフォルト引数、例外仕様、ブレースまたはイコール初期化子のいずれでもないため、クラスは不完全と見なされるため、これをいつ許可するかを決定するのはコンパイラ次第だと思います-ただし、コードをコンパイルしなくても、標準では問題ありません。

私が考えることができる唯一の解決策は、あなたが提案したもの、またはconstexprsを別の(可能な基本)クラスに移動することです。

于 2013-09-17T17:06:38.197 に答える