gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:09 25 4
gpt4 key购买 nike

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

#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 类的源文件中,而不是放在标题中。

希望这对您有所帮助!

关于c++ - 构造函数参数默认值的链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com