Mih*_*dor 2 c++ linker static 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;
}
Run Code Online (Sandbox Code Playgroud)
尽管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)
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
这实际上与使用默认参数无关.相反,它是静态变量在C++中如何工作的副作用.
在C++类中拥有一个静态对象是一个两步的过程.首先,你必须声明你已经完成的静态对象,但是你必须在某个地方实际定义它,这样C++就知道哪个翻译单元应该包含那个静态对象的一个定义.你可以通过写作来做到这一点
const std::vector<int> Test::staticVector;
Run Code Online (Sandbox Code Playgroud)
在类之外的C++源文件中的某个地方.这告诉C++您的源文件包含此对象的定义,该定义应解决链接器错误.
如果您有多个不同的源文件而不只是一个,那么您应该将此行放在类的源文件中Test而不是标题中.
希望这可以帮助!