2017-05-12 5 views
0

私は関数へのポインタを持つ単純なクラスを持っています。コンストラクタ関数へのポイントにそれを「朝()」とコンパイルするとき、私はエラーメッセージが表示されます:C++関数ポインタの代入でクラス内の型を変換できない

error: cannot convert ‘Test::morning’ from type ‘void (Test::)()’ to type ‘Test::function {aka void (*)()}’ 
    Test() {assignPtr = 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"); 
} 

答えて

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 
1

関数ポインタとメンバ関数へのポインタは同じものではありません。コンパイラがあなたに伝えていることです。タイプが一致しません。あなたの目標はvoid(*)()と定義されています。あなたはそれを手渡そうとしていますvoid(Test::*)()。彼らは同じ呼び出しのセマンティクスさえ持っていません。後者は盲目のTest*const thisパラメータを持っています。

functionのタイプを変更するか、それを呼び出す通常の機能を与えます。

ヒント:あなたのコンパイラは、これをコンバートすることができないという苦情でエラーが発生すると、あなたのタイプは一致しません。

関連する問題