You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:20:32