C++中「undefined reference to」错误求助:无法定位根本原因
解决C++静态成员变量的未定义引用链接错误
错误原因
你碰到的链接错误,核心问题是类MyFunctionRunner里的静态成员变量func_只在类内部做了声明,没有在全局作用域完成定义。C++规定,类的静态成员变量必须在类外部单独定义,否则链接器找不到该变量的实际存储位置,就会抛出"undefined reference"错误。
解决方法
在MyFunctionRunner类的定义之后,添加静态成员变量的定义语句:
// 为静态成员变量分配内存空间,可按需初始化 std::function<void()> MyFunctionRunner::func_;
如果需要给它一个默认值(比如空函数),也可以直接初始化:
std::function<void()> MyFunctionRunner::func_ = nullptr;
修改后的完整代码
#include <iostream> #include <functional> using namespace std; class MyClass1{ public: void printX(){ std::cout<<"print X from MyClass1"<<std::endl; } }; class MyClass2{ public: void printX(){ std::cout<<"print X from MyClass2"<<std::endl; } }; class MyFunctionRunner{ public: static void callFunc(){ func_(); //Calls the function that's set } static void setFunc(std::function<void()> func){ func_ = func; //Sets a function } private: static std::function<void()> func_; }; // 新增:定义静态成员变量 std::function<void()> MyFunctionRunner::func_; template<class MyClass> void MyFunc(){ MyClass myObj{}; MyFunctionRunner::setFunc( [myObj]() mutable{ myObj.printX(); }); //Passes in a lambda function as a parameter that captures `myObj` by value. }; int main() { MyFunc<MyClass1>(); MyFunc<MyClass2>(); MyFunctionRunner::callFunc(); return 0; }
额外说明
你的代码还有个逻辑细节:连续调用MyFunc<MyClass1>()和MyFunc<MyClass2>()会覆盖func_的值,最后callFunc()只会执行MyClass2的printX方法。如果需要依次执行两个类的方法,得调整setFunc和callFunc的逻辑(比如用函数列表存储),但这不是当前链接错误的核心问题。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

