0

他のスレッドで非静的メンバー関数を実行しようとしています。もし私が行くならば:

void *(PortManager::*innerAskPtr)() = &this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

それはそれを促します

ISO C++ では、修飾されていない、または括弧で囲まれた非静的メンバー関数のアドレスを取得して、メンバー関数へのポインターを形成することを禁止しています。

しかし、この余分な参照記号を削除すると:

void *(PortManager::*innerAskPtr)() = this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

それはそうなる

「PortManager::innerAsk」をタイプ「void (PortManager::)()」からタイプ「void* (PortManager::*)()」に変換できません

これらの追加の星 (*) を左側に追加するには、右側に何を追加しますか?

しかし、それでも、そこにたどり着いたとしても、常に別のエラーがあります。run(T(*)()) について:

'run(void* (PortManager::*&)()) の呼び出しに一致する関数がありません

この参照がどのようにそこに到達したかを理解するのは頭がおかしいです...

4

1 に答える 1

2

QtConcurrent::runのドキュメントは、これをすべて説明しているようです。

メンバー関数の使用

QtConcurrent::run()メンバー関数へのポインターも受け入れます。最初の引数は、const 参照またはクラスのインスタンスへのポインターである必要があります。const 参照による受け渡しは、const メンバー関数を呼び出すときに便利です。ポインターによる受け渡しは、インスタンスを変更する非 const メンバー関数を呼び出すのに役立ちます。

このテキストの直後にコード例があります。

あなたのコードで:

void *(PortManager::*innerAskPtr)() = this->innerAsk;
QFuture<void> f = QtConcurrent::run(innerAskPtr);

エラーメッセージは がthis->innerAsk返されることを示していますvoidが、それをメンバー関数へのポインターに割り当てようとしていますvoid *。あなたはおそらく次のことを意味していました:

void (PortManager::*innerAskPtr)() = &PortManager::innerAsk;

を呼び出すためにこれを行う必要はありませんQtConcurrent::run。コード例が示すように、次のように書くことができます。

QtConcurrent::run( this, &PortManager::innerAsk );
于 2014-06-04T03:01:38.173 に答える