有人能解释一下为什么下面的代码不能编译吗?至少在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;
}
问题的出现是由于新的c++特性和您正在尝试做的事情之间的有趣冲突。首先,让我们看一下push_back签名:
void push_back(const T&)
它期望引用类型为t的对象。在旧的初始化系统中,这样的成员是存在的。例如,下面的代码可以很好地编译:
#include <vector>
class Foo {
public:
static const int MEMBER;
};
const int Foo::MEMBER = 1;
int main(){
std::vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
这是因为在某个地方存在一个实际的对象,其中存储了该值。然而,如果你切换到指定静态const成员的新方法,就像上面那样,Foo::MEMBER不再是一个对象。它是一个常数,有点类似于:
#define MEMBER 1
但是没有预处理宏的麻烦(并且有类型安全)。这意味着,期待一个引用的向量不能得到一个引用。