【问题标题】:const static member initialization - inside vs outside class definition [duplicate]const静态成员初始化-内部与外部类定义[重复]
【发布时间】:2016-02-03 20:59:35
【问题描述】:

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

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

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    上面的两个初始化有什么区别?为什么会导致 stl 容器出错?

    std::vector&lt;int&gt;::push_back() 的参数类型是int const&amp;。每当一个变量被引用或指针使用时,它必须被定义。

    Class::f 实现的简单更改将消除定义Class::var 的需要。

    void Class::f() {
       std::vector<int> vec;
       int v = var;
       vec.push_back(v);
    }
    

    这里,var 不作为引用使用。因此,无需定义Class::var

    【讨论】:

    • 谢谢。此外,使用声明中的初始化在类外部定义它const int Class::var; 这允许标头中的值清晰,但仍然可以引用。
    • 同样,创建一个临时的vec.push_back((int)var) 可读性很强,不需要定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多