2

厉害了大家!我有一个函数指针方法

int Myclass::*myMethod(char* a,char* b){
  //some code
}

并尝试运行它

bool Myclass::myMethod2(){
    AnotherClass *instance = AnotherClass:getInstance();
    instance-> addParams(&myMethod);
    return true;
}

AnotherClass - 另一个 dll 中的此类。另一个类定义

class AnotherClass
{
    //friend class Myclass;
public:
    static AnotherClass* getInstance();
    void addParams(int (*myMethod)(char*, char*) =0);
       //I try so void addParams(int (Myclass::*myMethod)(char*, char*) =0);
};

并有错误 C2664。无法将参数 1 从 'int Myclass::* (__cdecl *)(char *,char *)' 转换为 'int (__cdecl *)(char *,char *)。

嗯..我该怎么办?

4

3 回答 3

2

你不能。

addParams()方法需要一个接受两个char*参数的函数。

Myclass::myMethod接受两个char*参数和一个 Myclass 对象

没有办法使两者兼容。

于 2011-07-18T10:05:43.623 回答
2

编辑:我稍微误读了你的问题,并没有注意到关于 DLL 的一点 - 但是如果你可以控制 DLL 并希望修改它,那么一和三仍然适用。如果没有,你能做的只有第二个。


在这种情况下,您可以做三件事:

一,通过这样声明来改变你AnotherClass的设计方式addParams

void addParams(int (Myclass::*)(char*, char*) =0);

二,您可以创建Myclass::myMethod()一个静态成员,然后您的原始声明addParams将起作用。

三、可以使用boost之类的库来绑定方法,如下:

bool Myclass::myMethod2(){
    AnotherClass *instance = AnotherClass:getInstance();
    instance-> addParams(boost::bind(&Myclass::myMethod, this));
    return true;
}

class AnotherClass
{
    //...
    void addParams(boost::function<int(char*, char*)>);
};
于 2011-07-18T10:06:52.297 回答
0

您正在从对象的实例内部调用该方法。(假设Myclass::myMethod2()不是静态的)

您可以从此调用该方法:

instance-> addParams(&(this->myMethod));
于 2011-07-18T10:18:40.117 回答