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

Linker issue with default values for constructor parameters

本文关键字:问题 链接 默认值 参数 构造函数      更新时间:2023-10-16

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

#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)

我在这里错过了什么?

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

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

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

在类之外的C++源文件中的某个位置。 这会告知C++源文件包含此对象的定义,这应该可以解决链接器错误。

如果您有多个不同的源文件,而不仅仅是一个,则应将此行放在 Test 类的源文件中,而不是标头中。

希望这有帮助!

你已经声明了静态成员,但还没有定义它。下课后,您需要以下内容:

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

您可能希望使用一些值初始化它,具体取决于您真正计划使用它做什么。