谁能解释为什么以下代码无法编译?至少在g ++ 4.2.4上。
更有趣的是,当我将MEMBER转换为int时为什么会编译?
#include <vector>
class Foo {
public:
static const int MEMBER = 1;
};
int main(){
vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
你实际上需要在某个地方(在类定义之后)定义静态成员。尝试这个:
class Foo { /* ... */ };
const int Foo::MEMBER;
int main() { /* ... */ }
那应该摆脱未定义的参考。
好的一点,内联静态const整数初始化创建了一个带范围的整数常量,您不能使用其地址,而vector则采用一个引用参数。
该答案仅解决问题的第一部分。第二部分更有趣:为什么添加NOP强制转换使其无需外部声明即可工作?
我花了很多时间弄清楚,如果类定义在头文件中,则静态变量的分配应在实现文件中,而不是头中。
@shanet:非常好-我应该在回答中提到这一点!
但是,如果我将其声明为const,是否无法更改该变量的值?