C++ 无法转换‘;作废(myClass::*)()至作废(*)()

C++ 无法转换‘;作废(myClass::*)()至作废(*)(),c++,c++11,member-function-pointers,C++,C++11,Member Function Pointers,所以,我知道这个问题存在于很多地方。但这些例子都没有帮助我解决我的问题 我试图创建一个方法指针(在一个类中),因此它将根据特定条件处理该类的几个方法之一 我尝试过使用静态函数,但没有成功(我可能误解了如何使用的说明…) 以下是头文件: class myClass { public: myClass(int value); void methodA(const string &msg); void methodB(const string &msg);

所以,我知道这个问题存在于很多地方。但这些例子都没有帮助我解决我的问题

我试图创建一个方法指针(在一个类中),因此它将根据特定条件处理该类的几个方法之一

我尝试过使用静态函数,但没有成功(我可能误解了如何使用的说明…)

以下是头文件:

class myClass
{
public:
    myClass(int value);

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

    void (*send_msg)(const string &msg);
};
和加拿大人民党:

myClass::myClass(int value){
    if(value > 0){
        send_msg = &methodA
    }
    else{
        send_msg = &methodB
    }
}
还有错误,正如你们中的一些人已经知道的:

错误:ISO C++禁止接受不合格或括号的非静态成员函数的地址,以形成指向成员函数的指针。说“&myClass::methodA”[-fpPermissive]

错误:无法将赋值中的“void(myClass::)(const string&){aka void(myClass::)(const std::basic_string&)}”转换为“void()(const string&){aka void()(const std::basic_string&)}”

任何帮助都将不胜感激

编辑 多亏了Jose,它可以被编译:

void (myClass::*send_msg)(const string &msg);
以及任务:

send_msg = &myClass::methodA;
但是现在,当我试图使用代码时,我无法调用函数指针:

this->myClass_instance.send_msg(line); //*****getting error*****
时,此
是其他类的实例。 错误是:

错误:必须使用“.”或“->”来调用“((otherClass*)this)->otherClass::myClass_instance.myClass::send_msg(…)”中成员函数的指针,例如“(…->*((otherClass*)this)->otherClass::myClass_instance.myClass::send_msg)(…)”

我的演示:

通过添加
myClass::
使send\u msg成为指向类方法的指针

void (myClass::*send_msg)(const string &msg);
另外,您似乎缺少了
myClass::
和分号

    send_msg = &myClass::methodA;
else
    send_msg = &myClass::methodB;
编辑:

由于您在评论中要求如何从课堂外调用它:

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

void(*发送消息)(常量字符串和消息)
是自由函数或静态成员函数的指针声明,而不是非静态成员函数。您可能需要:

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

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

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

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


您还可以使用
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”
。@Eli那么你是如何调用它的呢?@Eli检查这个并从那里开始工作。它提供了一个您正在尝试执行的工作示例(另外,我添加了一个名为“method”的新函数,可以更轻松地从外部调用该函数);在ideone示例中向下滚动并检查输出难以置信!嗯。。使用
std::function
和lambda函数不是更容易、更可读、更简短吗?@DavidHaim很高兴看到一个例子,你打算如何使用
send_msg
?根据你的编辑,
methodA
methodB
应该是静态成员函数。也许这不是你想要的(也许在现实生活中,您的代码要比这复杂得多)但我忍不住认为,这是一种解决简单问题的非常复杂的方法。例如,使用纯虚函数和工厂方法的派生类不会为您提供一种更易于维护和使用的解决方案吗?只是一个建议。但我认为问题是关于成员函数指针的,知道如何这样做,不要选择std::function这条最简单的路径。主要是因为它有很多开销,比如内存分配、虚拟调用,甚至一个空的std::function对象本身通常都非常大(MSVC2015中至少有40个字节)。我倾向于使用最小的开销。我没有检查它,但我希望Jose解决方案会更好。+1对于两个答案。我同意这不是100%的前向等价于成员函数,我想展示另一种方法。无论如何,尽管缺点是实实在在的,但优点是
std::function
更容易实现d更安全,因为它不能为null或挂起。空的
std::function
在调用时将引发异常,而调用空的/挂起的成员函数将具有UB
std::function
更容易,我同意,但您可以引用成员函数指针,然后它就不能挂起。例如:
const decltype(&methodA)&发送_msg;
(您可以在成员初始值设定项列表中分配它)。并且只有4字节的开销。
myClass::myClass(int value){
    if(value > 0){
        send_msg = &myClass::methodA;
                    ~~~~~~~~~
    }
    else{
        send_msg = &myClass::methodB;
                    ~~~~~~~~~
    }
}
#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");