我有一个简单的类,它有一个指向函数的指针。构造函数将其指向函数" morning()"我在编译时收到错误消息:
error: cannot convert ‘Test::morning’ from type ‘void (Test::)()’ to type ‘Test::function {aka void (*)()}’
Test() {assignPtr = morning;}
代码确实在" morning()"并且在函数外部声明了typedef,我无法弄清楚如何使它在当前类中工作。
#include <iostream>
#include <string>
class Test {
public:
Test() {assignPtr = morning;}
void say(std::string a) {name = a; assignPtr();};
private:
typedef void(*function)();
void morning() {std::cout << "Good morning, " << name << std::endl;}
void night() {};
function assignPtr;
std::string name;
};
int main() {
Test a;
a.say("Miguel");
}
答案 0 :(得分:3)
指向成员函数的指针不是常规函数指针;该类是该类型的一部分,您需要指定要使用它调用它的对象。
您需要使用正确的类型
typedef void(Test::*function)();
然后在创建指针和调用它时调整语法。
Test() {assignPtr = &Test::morning;} // Get pointer-to-member
void say(std::string a) {name = a; (this->*assignPtr)();}; // Use pointer-to-member
答案 1 :(得分:1)
函数指针和指向成员函数的指针不是一回事。这就是你编译器告诉你的。类型不匹配。您的目标定义为void(*)()
,并且您正试图将其void(Test::*)()
移交。它们甚至没有相同的调用语义。后者有一个盲Test*const this
参数。
更改function
的类型或为其提供常规功能。
提示:任何时候你的编译器出错而抱怨无法将其转换为...你的类型不匹配。