无法将‘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) (...)’
通过添加 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);
或者您可以将函数设为静态成员函数:
static void methodA(const string &msg);
static void methodB(const string &msg);
对于第一个编译错误,在获取其地址时应限定非静态成员函数的名称(仅适用于第一个解决方案):
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");
所以,我知道很多地方都存在这个问题。但是 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) (...)’
通过添加 myClass::
.
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);
或者您可以将函数设为静态成员函数:
static void methodA(const string &msg);
static void methodB(const string &msg);
对于第一个编译错误,在获取其地址时应限定非静态成员函数的名称(仅适用于第一个解决方案):
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");