无法将‘void (myClass::*)() 转换为 void (*)()

cannot convert ‘void (myClass::*)() to void (*)()

所以,我知道很多地方都存在这个问题。但是 none 个示例帮助我解决了问题。

我正在尝试创建一个 方法指针 (在 class 中),因此它将根据 class 的几种方法之一进行寻址具体条件。

我试过,但没有成功使用静态函数(我猜我误解了如何这样做的说明...)。

这是头文件:

class myClass
{
public:
    myClass(int value);

    void methodA(const string &msg);
    void methodB(const string &msg);

    void (*send_msg)(const string &msg);
};

和 cpp:

myClass::myClass(int value){
    if(value > 0){
        send_msg = &methodA
    }
    else{
        send_msg = &methodB
    }
}

以及你们中的一些人已经知道的错误:

error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&myClass::methodA’ [-fpermissive]

error: cannot convert ‘void (myClass::)(const string&) {aka void (myClass::)(const std::basic_string&)}’ to ‘void ()(const string&) {aka void ()(const std::basic_string&)}’ in assignment

任何帮助将不胜感激。

编辑 感谢何塞,它可以编译:

void (myClass::*send_msg)(const string &msg);

和作业:

send_msg = &myClass::methodA;

但是现在,当我尝试使用我无法调用函数指针的代码时:

this->myClass_instance.send_msg(line); //*****getting error*****

this 是其他 class 的实例时。 错误是:

error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((otherClass*)this)->otherClass::myClass_instance.myClass::send_msg (...)’, e.g. ‘(... ->* ((otherClass*)this)->otherClass::myClass_instance.myClass::send_msg) (...)’

我的演示:http://ideone.com/Vx4x88

通过添加 myClass::.

使 send_msg 成为指向 class 方法的指针
void (myClass::*send_msg)(const string &msg);

此外,您似乎缺少 myClass::

末尾的分号 ;
    send_msg = &myClass::methodA;
else
    send_msg = &myClass::methodB;

编辑:

由于您在评论中询问了如何从 class 之外调用它:

myClass c(1);
(c.*c.send_msg)("hi");

myClass * p = new myClass(1);
(p->*p->send_msg)("hi");

void (*send_msg)(const string &msg); 是自由函数或静态成员函数的指针声明,不是非静态成员函数。你可能想要:

void (myClass::*send_msg)(const string &msg);

LIVE1

或者您可以将函数设为静态成员函数:

static void methodA(const string &msg);
static void methodB(const string &msg);

LIVE2

对于第一个编译错误,在获取其地址时应限定非静态成员函数的名称(仅适用于第一个解决方案):

myClass::myClass(int value){
    if(value > 0){
        send_msg = &myClass::methodA;
                    ~~~~~~~~~
    }
    else{
        send_msg = &myClass::methodB;
                    ~~~~~~~~~
    }
}

你也可以使用std::function

#include <functional>

class myClass
{
public:
    myClass(int value){
     if(value > 0){
        send_msg = [this](const std::string& str){ methodA(str); };
     }
     else{
         send_msg = [this](const std::string& str){ methodB(str); };
     }
    }

    void methodA(const string &msg);
    void methodB(const string &msg);

    std::function<void(const string &msg)> send_msg;
};

要调用该函数,只需使用 () :

myClass obj(10);
obj.send_msg("hi there");