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 )是(大概)返回一个 type 的值QPair<void (*)(), int>,因为它不知道你想要一个 type 的值QPair<void (*)( ... ), int>。以所需的函数指针类型qMakePair<void (*)( ... ), int>( aaa::ccc, 0 )显式调用它。reinterpret_cast aaa::ccc

更不用说这是(几乎可以肯定)非法的,因为aaa::ccc没有正确的签名并且不能通过您正在使用的函数指针类型调用。

于 2012-07-09T19:40:32.523 回答