链接器问题与构造函数参数的默认值

时间:2012-06-13 00:56:22

标签: c++ static linker default-value

我试图为方法(或构造函数)参数的默认值强加某种语义逻辑。这是我尝试过的:

#include <iostream>
#include <vector>
class Test
{
public:
    static const std::vector<int> staticVector;
    Test (const std::vector<int> &x = Test::staticVector) {}
};

int main ()
{
    Test x;

    return 0;
}

尽管staticVector相当冗余,但由于C ++不允许将NULL作为std :: vector的实例传递,我希望避免对构造函数std :: vector()进行冗余调用,所以我想出了这个方法...

不幸的是,当我尝试编译它时,链接器会抛出此错误:

error LNK2001: unresolved external symbol "public: static class std::vector<int,class std::allocator<int> > const Test::staticVector" (?staticVector@Test@@2V?$vector@HV?$allocator@H@std@@@std@@B)

我在这里缺少什么?

2 个答案:

答案 0 :(得分:6)

这实际上与使用默认参数无关。相反,它是静态变量在C ++中如何工作的副作用。

在C ++类中拥有一个静态对象是一个两步过程。首先,你必须声明你已经完成的静态对象,但是你必须在某个地方实际定义它,这样C ++就知道哪个翻译单元应该包含那个静态对象的一个​​定义。你可以写

来做到这一点
const std::vector<int> Test::staticVector;

在类之外的C ++源文件中的某处。这告诉C ++你的源文件包含这个对象的定义,它应该解决链接器错误。

如果您有多个不同的源文件而不只是一个,那么您应该将此行放在Test类的源文件中而不是标题中。

希望这有帮助!

答案 1 :(得分:1)

您已声明静态成员,但未对其进行定义。课后你需要这样的东西:

 const std::vector<int> Test::staticVector;

您可能希望根据您真正计划使用的内容对其进行初始化。