我试图为方法(或构造函数)参数的默认值强加某种语义逻辑。这是我尝试过的:
#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)
我在这里缺少什么?
答案 0 :(得分:6)
这实际上与使用默认参数无关。相反,它是静态变量在C ++中如何工作的副作用。
在C ++类中拥有一个静态对象是一个两步过程。首先,你必须声明你已经完成的静态对象,但是你必须在某个地方实际定义它,这样C ++就知道哪个翻译单元应该包含那个静态对象的一个定义。你可以写
来做到这一点const std::vector<int> Test::staticVector;
在类之外的C ++源文件中的某处。这告诉C ++你的源文件包含这个对象的定义,它应该解决链接器错误。
如果您有多个不同的源文件而不只是一个,那么您应该将此行放在Test
类的源文件中而不是标题中。
希望这有帮助!
答案 1 :(得分:1)
您已声明静态成员,但未对其进行定义。课后你需要这样的东西:
const std::vector<int> Test::staticVector;
您可能希望根据您真正计划使用的内容对其进行初始化。