传递函数指针时未解析的外部符号[重复]

Posted

技术标签:

【中文标题】传递函数指针时未解析的外部符号[重复]【英文标题】:unresolved external symbol when passing a function pointer [duplicate] 【发布时间】:2017-07-01 15:39:29 【问题描述】:

我正在尝试创建一个通用按钮,并且我希望能够在我单击它时传递一个函数来调用它。

main.cpp:

#include "Window.h"

int testfunction() 
   print("Test");
   return 1;


...other stuff...

window->SetButtonFunction_NoArgs<int>(" *unrelated stuff* ", &testfunction);

window 是一个 WindowMain 类:

window.h:

class WindowMain 
     *Stuff*
     template <class R1> void SetButtonFunction_NoArgs(string id, R1(*func)());
     *Other Stuff*
;

window.cpp:

///Find the object of that id and set the fuction to it
template <class R1> void WindowMain::SetButtonFunction_NoArgs(string id,  R1(*func)()) 
    for (int i = 0; i < objects_.size(); i++) 
        if (objects_[i].getId() == id) 
            objects_[i]->AddButton_NoArgs<R1>(func);
        
    

问题出在我认为的某个地方,但我找不到它...当我尝试编译时,它给了我这个:

1>main.obj : error LNK2019: unresolved external symbol "public: void __cdecl WindowMain::SetButtonFunction_NoArgs<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int (__cdecl*)(void))" (??$SetButtonFunction_NoArgs@H@WindowMain@@QEAAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6AHXZ@Z) referenced in function "void __cdecl Create(void)" (?Create@@YAXXZ)

感谢您的帮助!

【问题讨论】:

看看 std::function 和 lambdas 或 std::bind! 【参考方案1】:

模板方法必须在头文件中定义。如果它不是模板,您可以将定义移动到 .cpp 文件(尽管您希望包含 window.h)

【讨论】:

“必须在头文件中定义模板方法” - 这是错误的,不考虑显式模板实例化。

以上是关于传递函数指针时未解析的外部符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用CUDA Driver API VS2012时未解析的外部符号

指向该类的类指针成员:未解析的外部符号

C言语指针变量作为函数参数

将指针传递给函数并更改它指向的地址[重复]

指针的高阶用法——传递指针给函数

无法使用双指针作为函数参数传递二维数组[重复]