2016-08-05 23 views
1

私が調べたことから、構文は正しいが、コンパイラ(VS2015)は不平を言っている。注意してください、私はネットワークのクラスで名前空間eeを使用しています。ここでは、コードC++ 11 - メンバー関数をスレッドに渡すと、オーバーロードされた関数は2つの引数をとる

//code that doens't work 
    thread clientThread(&ee::Network::clientRun, new ee::Network); 

*ノートです:実際のコードでは、私は、引数として新しいを呼び出していないよ、私はコードを短くするために、ここでそれをやりました。

私は関数をテストしていて、うまく機能していますが、スレッドを使って機能させることはできません。ここに彼らの署名があります。

void serverRun(); 
    void clientRun(); 
    void clientRun(string ip); 

私のエラーは、次のとおりです。

  1. エラーC2661 'のstd ::スレッド::スレッド':いいえオーバーロードされた関数は2つの引数

  2. を取るABCコンストラクタ「のstdのインスタンス:: thread :: thread "は引数リストと一致します

誰でも何が起こっているのかについての洞察はありますかこの状況では?

+1

はおそらくそれほど愚かではない質問は、あなたが右、 '' が含まれて?私たちはここで多くのことをする必要はありません。 – WhozCraig

+1

Visual C++エラーコードのように見えますが、どのバージョンを使用していますか? –

+3

また、あいまいさの問題があります。 'void(ee :: Network :: * threadProc)()=&ee :: Network :: clientRun;を試してください。スレッドclientThread(threadProc、新しいee ::ネットワーク); ' –

答えて

3

ベンの提案は私の問題を解決しましたが、私はなぜそれがわかりません。

問題は最初の引数&ee::Network::clientRunです。 clientRunには2つのオーバーロードがありますが、テンプレートの控除時点(引数のタイプをstd::thread::thread<>に推論するため)では、コンパイラはどちらのオーバーロードがより有効かを区別する立場にはありません。 Network::clientRunの種類を指定することで、むしろvoid (ee::Network*)(string)等しく有効よりvoid (ee::Network*)(void)する - 前の呼び出しへのキャストは、それのためのコンパイラの仕事を行っているので、

ベンのソリューションを働きました。

いくつかの例:

#include <thread> 
#include <string> 

struct Network 
{ 
    void clientRun(); 
    void clientRun(std::string); 
}; 

int main() 
{ 
    // not ok... 
// std::thread clientThread(&Network::clientRun, new Network); 

    // ok - tells the compiler which overload 
    auto member_function = static_cast<void (Network::*)()>(&Network::clientRun); 
    std::thread clientThreadA(member_function, new Network); 

    // also ok 
    using call_type = void (Network::*)(); 
    std::thread clientThreadB(call_type(&Network::clientRun), new Network); 
} 
関連する問題