2016-12-26 32 views
2

私はこれに従いますexample。しかし、私は、コンパイル時に、それはエラーを返します:ラインで非静的メンバー関数の無効な使用C++

Invalid use of non-static member function

void(Machine:: *ptrs[])() = 
    { 
    Machine::off, Machine::on 
    }; 

私は

クラスで void on();
class Machine 
{ 
    class State *current; 
    public: 
    Machine(); 
    void setCurrent(State *s) 
    { 
     current = s; 
    } 
    static void on(); // I add static here ... 
    static void off(); // and here 
}; 

staticを追加しようとしました。しかし、それは

と文句を言い

Invalid use of member Machine::current in static member function

これを解決する手助けができますか?

答えて

5

スタティックメンバ関数またはフリー関数とは異なり、非スタティックメンバ関数はメンバ関数ポインタにimplicitly convertを渡しません。

(強調鉱山)

An lvalue of function type T can be implicitly converted to a prvalue pointer to that function. This does not apply to non-static member functions because lvalues that refer to non-static member functions do not exist.

だからあなたは(すなわち、非静的メンバ関数ポインタを取得する)非静的メンバ関数のアドレスを取得するために、明示的に&を使用する必要があります。例えば

void(Machine:: *ptrs[])() = 
    { 
    &Machine::off, &Machine::on 
    }; 

あなたは静的メンバ関数として宣言した場合、あなたは(非メンバ関数ポインタの配列に)ptrsの種類を変更する必要があります。静的メンバー関数の場合は、&を明示的に使用しないでください。例えば

void(*ptrs[])() = 
    { 
    Machine::off, Machine::on 
    }; 
+0

Ah、oui。それは動作しますが、理由を説明できますか?ありがとうございました – GAVD

+0

@GAVD説明が追加されました。 – songyuanyao

+0

@songyuanyao pcapライブラリのpcap_loop()も同様のエラーをスローします。あなたはこれを見て、何か考えているかどうか教えてください。 Tqvm 0​​http://stackoverflow.com/questions/43108998/c-pcap-loop-arguments-issue – Wei

関連する問題