构造函数参数的默认值的链接器问题
Linker issue with default values for constructor parameters
我试图为方法(或构造函数)参数的默认值强加某种语义逻辑。这是我尝试过的:
#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;
您可能希望使用一些值初始化它,具体取决于您真正计划使用它做什么。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 基于boost的程序的静态链接——zlib问题
- 使用jsoncpp库时出现链接问题
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- sqlite3 和生成文件中的链接出现问题
- 如何将GTest与CMake一起使用?遵循谷歌指南时的链接问题
- 未解决的外部链接问题
- 使用转换器提升 Python 问题 - 静态链接
- 'make check' GLIBC 运行时的链接问题
- 在树莓派上用libtorch构建程序时的链接问题
- QtCreator with C 库中的链接器问题
- 野牛弹性链接问题
- 与 AWS 开发工具包的链接问题
- 使用 NVIDIA GPU 在 Cygwin 中链接 OpenCL 库时遇到问题
- 为什么当我从语句检查中删除"+ mod"时,以下程序给出错误的答案。问题链接:https://www.codechef.com/problems/FFC219B
- PCL 和 CMake 的问题:链接时未定义统计异常值删除
- VC++使用gumbo查询时出现问题(链接错误)
- 使用CMake问题链接Boost(Ubuntu 14.04)
- MySQL连接器问题-链接等等
- MinGW 与 MSVC 的 dll 库问题链接(未定义的引用)