忽略特定的错误消息,核心问题是您试图在声明中初始化静态成员属性,而通常应该在定义中完成。
// 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];
};
如果该值是在变量的定义中定义的,那么编译器只能在该单个翻译单元中使用它。似乎您的编译器正在执行两项测试,一项针对 const-ness,另一项针对积分部分,因此有两条错误消息。
可能影响编译器设计的另一件事是 C++11 标准允许在类的非静态成员的声明中使用初始化器,然后将在每个不提供该字段的值:
struct test {
int a = 10;
int b = 5;
test() : a(5) // b(5) implicitly generated
{}
};
这与您的特定问题无关,因为您的成员是静态的,但它可能解释了为什么编译器中的测试按原样拆分。