特定のエラー メッセージを無視すると、主な問題は、一般に定義で行う必要があるのに、宣言で静的メンバー属性を初期化しようとしているということです。
// header
struct test {
static std::string x;
};
// single cpp
std::string test::x = "foo";
エラーメッセージに戻ります。C++03 標準には例外があり、定数整数型の宣言に初期化子を提供できるため、ヘッダーを含むすべての変換単位で値を表示できるため、定数式として使用できます。 :
// header
struct test {
static const int size = 10;
};
// some translation unit can do
struct A {
int array[test::size];
};
値が変数の定義で定義されている場合、コンパイラはその値をその単一の翻訳単位でしか使用できませんでした。あなたのコンパイラは2つのテストを行っているようです。1つはconst-ness用で、もう1つは整数部分用であり、したがって2つのエラーメッセージです。
コンパイラでの設計に影響を与える可能性のあるもう 1 つのことは、C++11 標準では、クラスの非静的メンバーの宣言で初期化子が許可されていることです。これは、クラスを提供しない各コンストラクターの初期化子リストで使用されます。そのフィールドの値:
struct test {
int a = 10;
int b = 5;
test() : a(5) // b(5) implicitly generated
{}
};
メンバーは静的であるため、これは特定の問題とは関係ありませんが、おそらくコンパイラのテストがそのまま分割された理由を説明しています。