我知道静态文字类型成员可以在类定义中初始化,而非文字类型则不能。
class Class
{
static const int lt = 0; //OK
static const std::string nlt = "hello"; //compilation error
};
然而,我遇到了一个奇怪的问题,如果它们在类定义中初始化而不是在外部,我不能在STL容器中使用成员。
class Class
{
public:
static const int var = 1;
void f();
};
void Class::f() {
std::vector<int> vec;
vec.push_back(var);
}
上面的示例导致链接器错误undefined reference to Class::var
如果我将初始化移到外面,则错误就会消失。
const int Class::var = 1;
上述两个初始化之间有什么区别?为什么会导致stl容器出错?
答案 0 :(得分:4)
上述两个初始化之间有什么区别?为什么会导致stl容器出错?
std::vector<int>::push_back()
的参数类型为int const&
。每当引用或指针使用变量时,必须定义它。
对Class::f
实施的简单更改将无需定义Class::var
。
void Class::f() {
std::vector<int> vec;
int v = var;
vec.push_back(v);
}
此处,var
未被引用使用。因此,无需定义Class::var
。