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

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)

我在这里错过了什么?

tem*_*def 6

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

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

const std::vector<int> Test::staticVector;
Run Code Online (Sandbox Code Playgroud)

在类之外的C++源文件中的某个地方.这告诉C++您的源文件包含此对象的定义,该定义应解决链接器错误.

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

希望这可以帮助!

  • @ MihaiTodor-你必须在类之外声明它,以便编译器和链接器知道哪个目标文件实际包含静态对象的定义.这样,链接器可以将对静态对象的引用解析为单个实体. (2认同)