const静态成员初始化 - 内部与外部类定义

时间:2016-02-03 20:59:35

标签: c++ stl

我知道静态文字类型成员可以在类定义中初始化,而非文字类型则不能。

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容器出错?

1 个答案:

答案 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