3

私は宣言しました:

class aaa {
public:
    static std::queue<QPair<void (*)( ... ), int> > m_commands;
    static int bbb();
    static void ccc(...);
};

そして bbb() メソッドで私は書いた:

int aaa::bbb() {
    m_commands.push( qMakePair( aaa::ccc, 0 ) );
}

しかし、それは次のように不平を言います:

error C2664: 'void std::queue<_Ty>::push(QPair<T1,T2> &&)' : cannot convert parameter 1 from 'QPair<T1,T2>' to 'QPair<T1,T2> &&'

なぜ?私がそのような機能を持っていたとき:

void reg( void ( *invoker )( ... ), int args  ) {
    m_commands.push( qMakePair( invoker, args ) );
}

この方法で、上記の関数に静的関数を簡単に送信できます。

reg( aaa::ccc, 0 );
4

1 に答える 1

1

qMakePair( aaa::ccc, 0 )QPair<void (*)(), int>typeの値が必要であることを認識していないため、(おそらく) type の値を返していますQPair<void (*)( ... ), int>。目的の関数ポインター型として、qMakePair<void (*)( ... ), int>( aaa::ccc, 0 )または関数ポインター型に対して明示的に呼び出します。reinterpret_cast aaa::ccc

これは (ほぼ確実に) illegalであることは言うまでもaaa::cccありません。これは、正しい署名がなく、使用している関数ポインター型から呼び出すことができないためです。

于 2012-07-09T19:40:32.523 に答える