【问题标题】:C++ Function Pointer assignment cannot convert types inside a class [duplicate]C ++函数指针赋值无法转换类内的类型[重复]
【发布时间】:2017-10-12 03:36:19
【问题描述】:

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

【问题讨论】:

    标签: c++ function class pointers


    【解决方案1】:

    指向成员函数的指针不是普通的函数指针;该类是类型的一部分,您需要指定要使用哪个对象来调用它。

    你需要使用正确的类型

    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
    

    【讨论】:

      【解决方案2】:

      函数指针和指向成员函数的指针不是一回事。这就是你的编译器告诉你的。类型不匹配。您的目标定义为void(*)(),而您正试图将其交给void(Test::*)()。它们甚至没有相同的调用语义。后者有一个盲Test*const this参数。

      更改function 的类型或给它一个常规函数来调用。

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

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        相关资源
        最近更新 更多