函数指针-不明确的符号错误
function pointer - ambiguous symbol error
MyClass是一个单例类(在我的整个程序中只会有一个(。
我想做的事情如下。
- 使用AddData将数据添加到我的类中,返回一个函数指针,然后我可以将其传递给dll中的"另一个"函数
- 然后这个"其他"函数调用我的回调函数
我的课是这样的。
typedef void (*DataReceivedCallback)(int, int);
class MyClass
{
MyClass();
~MyClass();
void AddData(int sourceId, DataReceivedCallback &callback);
static void MyCallBackFunction(int var1, int var2);
};
void MyClass::AddData(int sourceId, DataReceivedCallback &callback)
{
callback = &MyCallBackFunction;
}
void MyClass::MyCallBackFunction(int var1, int var2 )
{
//do something blah blah
}
然后我可以做:
int main()
{
DataReceivedCallback callback;
MyClass->GetInstance()->AddData(1, callback);
callback(1,100);
}
当我完成这一步时,我看到我确实进入了回调MyCallBackFunction,这正是我想要的:(
然后我现在想做的是将这个在main中定义的"回调"传递给一个dll函数,该函数将回调回我的回调函数。
我有dll的代码,所以我想修改它的函数,以便它接受我的回调函数参数。
我在dll函数签名中这样做:
void * someDllFunction( int var1, int var2, DataReceivedCallback& callback)
{
callback(2, 200);
}
但我得到了一个错误:错误C2872:"DataReceivedCallback":不明确的符号
我该如何解决这个问题?这与只允许跨dll边界使用c样式参数有关吗??
typedef void (*DataReceivedCallback)(int, int);
应该是
typedef void (MyClass::*DataReceivedCallback)(int, int);
因为,MyCallBackFunction
是MyClass
的非静态成员方法。所以它不能有正则函数签名。还将分配更改为,
callback = &MyClass::MyCallBackFunction;
演示。
您的类型有误。DataReceivedCallback
,别名void(*)(int, int)
,是函数指针,但&MyClass::MyCallBackFunction
是指向成员函数(PTMF(的指针。这两者是完全不相关和不兼容的类型!
不能将成员函数视为自由函数。
既然你的类只有一个实例(注意:"一个实例",而不是"一个类";你总是只有一个类(,为什么还要麻烦成员函数呢?只需将函数设置为全局的(在名称空间内(,就完成了。尽管我可能误解了你的要求。
另一个注意事项:您不需要通过引用DLL函数来传递函数指针,只需通过值来传递即可。它们只是指针,所以重量很轻。
您缺少的是如何声明指向成员函数的指针,以及如何通过该指针调用成员函数,下面是一个基于您的示例的工作示例:
class MyClass;
//standard way to declare a pointer to member function should be - className::*memberFunName(para list)
typedef void (MyClass::*DataReceivedCallback)(int, int);
class MyClass
{
public:
void AddData(int sourceId, DataReceivedCallback &callback);
void MyCallBackFunction(int var1, int var2);
};
void MyClass::AddData(int sourceId, DataReceivedCallback &callback)
{
callback = &MyClass::MyCallBackFunction;
}
void MyClass::MyCallBackFunction(int var1, int var2 )
{
//do something blah blah
int tem = var1 + var2; //tem = 3 here
}
int main()
{
MyClass obj;
DataReceivedCallback callback;
obj.AddData(1, callback);
(obj.*callback)(1,2); //standard way to call the member function via function pointer
}
相关文章:
- 在C++中使用内联方法时出现未定义的符号错误
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 函数指针给我"重新声明为不同类型的符号"错误
- "byte":使用Crypto++和Windows SDK时出现不明确的符号错误
- 函数路径追加上未解决的外部符号错误
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 共享库中使用"使用命名空间"定义的符号错误
- 在FreesWitch中使用AWS C SDK加载模块时未定义的符号错误
- 在 Mac 上C++编译代码时处理“dyld:惰性符号绑定失败:找不到符号”错误
- C++编译错误LNK2019:未解决的外部符号错误
- VTK / ITK/ QT - 未解决的外部符号错误 (LNK2001)
- QT创建者:简单程序未解决的外部符号和外部符号错误
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- 标准::字符串::空的未定义符号错误;Mac OS High Sierra 上的 c++ 标准方法链接错误
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 由于使用未签名的INT,因此在Variadic模板C 上未解决的外部符号错误
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- 使用从WINRT网格类派生的抽象类时,Casttobase未解决的外部符号错误
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See