函数指针-不明确的符号错误

function pointer - ambiguous symbol error

本文关键字:符号 错误 不明确 指针 函数      更新时间:2023-10-16

MyClass是一个单例类(在我的整个程序中只会有一个(。

我想做的事情如下。

  1. 使用AddData将数据添加到我的类中,返回一个函数指针,然后我可以将其传递给dll中的"另一个"函数
  2. 然后这个"其他"函数调用我的回调函数

我的课是这样的。

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);

因为,MyCallBackFunctionMyClass的非静态成员方法。所以它不能有正则函数签名。还将分配更改为,

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
}
相关文章: