C ++函数指针赋值不能转换类中的类型

时间:2017-05-12 18:14:31

标签: c++ function class pointers

我有一个简单的类,它有一个指向函数的指针。构造函数将其指向函数" 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");
}

2 个答案:

答案 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的类型或为其提供常规功能。

提示:任何时候你的编译器出错而抱怨无法将其转换为...你的类型不匹配。