2017-02-22 11 views
8

キャストされたオブジェクトのメンバ関数へのポインタをvoid*から呼び出すのが難しいです。たとえば以下を参照してください。静的メソッドからメンバ関数へのポインタを呼び出すことができません

class Test 
{ 
public: 
    Test(int pointTo) 
    { 
     if (pointTo == 1) 
      function = &Test::Function1; 
     else 
      function = &Test::Function2; 
    } 

    static void CallIt(void* cStyle) 
    { 
     Test* t(static_cast<Test*>(cStyle)); 
     (t->*function)();// error C2568: '->*': unable to resolve function overload 
    } 

    void CallIt() 
    { 
     (this->*function)();// Works just fine 
    } 

private: 
    typedef void (Test::*ptrToMemberFunc)(); 

    ptrToMemberFunc function; 

    void Function1() 
    { 
     std::cout << "Function 1" << std::endl; 
    } 

    void Function2() 
    { 
     std::cout << "Function 2" << std::endl; 
    } 
}; 

int main() 
{ 
    Test t1(1); 
    Test t2(2); 

    Test::CallIt(static_cast<void*>(&t1)); 
    Test::CallIt(static_cast<void*>(&t2)); 

    t1.CallIt(); 
    t2.CallIt(); 

    return 0; 
} 

オブジェクトがvoid*とバックにキャストされた場合どうなりますか?なぜ、私はもはやメンバ関数へのポインタを呼び出すことができないのですか?

EDIT:次のように

CallIt()を変更するには、プログラムをコンパイルすることができますが、私はまだ元が機能しなかった理由として興味があります。

static void CallIt(void* cStyle) 
{ 
    Test* t(static_cast<Test*>(cStyle)); 
    Test::ptrToMemberFunc pf(t->function); 
    (t->*pf)(); 
} 
+0

私はちょうどダウンidentificatiorsに、wandboxでまったく同じコードを書いたこと面白いです。 Tuple_catの答えはこれを説明しています。基本的には、オブジェクトと呼び出し可能オブジェクトをリンクする必要があるため、間接演算子では不十分です。コンパイラの中には、このような静的なメンバのみを呼び出すことができることを伝えるような、より理解しやすいエラーメッセージがあります。 – Swift

+0

編集に関しては、 > * 'あなたを捨てている。それはオブジェクトとメンバ関数へのポインタを取った 'call_with_this'という名前の通常の関数だと考えてください。そして、あなたの元の働かないコールは 'call_with_this(t、function);'でした。ここで、 'function'という名前は' Test'クラスの非静的メンバーですが、 't'とは何の関係もありません。静的な関数なので、 '関数'という名前を解決するためには 'this'は表示されません。 't-> function'を要求すると、実際の値にアクセス可能な名前があります。 – GManNickG

+0

@GManNickGそれはまさにそれです。今、私は解決策を見ていますが、私はそれを得ていますが、 ' - > *演算子が実際に何をしているのか分かりませんでした(私は'(t->(* function)) ')。 – Kerry

答えて

10
main.cpp:17:14: error: invalid use of member 'function' in static member function 
     (t->*function)();// error C2568: '->*': unable to resolve function overload 
      ^~~~~~~~ 

function非静的データメンバであるので、あなたは、静的関数からアクセスすることはできません。

あなたはtfunctionを参照したい場合、あなたはそのようにそれを行うことができます。

 (t->*(t->function))(); 
+0

これは、非静的メンバーに '(this - > * function)() 'を書くように強制されているのと同じ理由で、最も内側の間接演算子はポインタの値を"取得 "し、 – Swift

関連する問題