如何在构造函数中向静态列表添加对象?VS17报LNK1120与LNK2001错误
解决Visual Studio中LNK1120和LNK2001链接错误
嘿,这俩链接错误的根源很明确——你在Test类里声明了一个静态成员objects,但没有在类的外部提供它的定义。C++里静态成员变量必须在类声明之外单独定义,否则链接器找不到它的实体,就会抛出LNK2001(未解析的外部符号),进而触发LNK1120(未解析的外部符号总数)。
修复步骤:
- 在类定义的外部(比如
main函数之前或者单独的.cpp文件里),添加静态成员的定义语句:
这行代码会为静态成员分配内存空间,让链接器能找到它。forward_list<Test*> Test::objects;
修复后的完整代码:
#include <forward_list> using namespace std; class Test { public: Test(){objects.push_front(this);} private: static forward_list<Test*>objects; }; // 这里是静态成员的定义,必须加! forward_list<Test*> Test::objects; int main(){ Test a; }
这样编译运行就不会再出现那两个链接错误了。另外提一句,如果你用C++17及以上版本,也可以把静态成员声明为inline,这样就能直接在类里定义,不用再写外部定义:
class Test { public: Test(){objects.push_front(this);} private: inline static forward_list<Test*>objects; // C++17及以上支持 };
这种写法更简洁,也能避免链接错误。
内容的提问来源于stack exchange,提问作者Святой Вельзевул
相关产品推荐
相关产品推荐

