2017-02-20 12 views
0
#include <thread> 
#include <iostream> 
#include <functional> 

struct C 
{ 
    void printMe() const 
    {} 
}; 

struct D 
{ 
    void operator()() const 
    {} 
}; 

int main() 
{ 
    D d; 
    std::thread t9(std::ref(d)); // fine 
    t9.join(); 

    C c; 
    std::thread t8(&C::printMe, std::ref(c)); // error in VS2015 
    t8.join(); 

/* 
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(238): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' 
1> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(238): note: With the following template arguments: 
1> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(238): note: '_Callable=void (__thiscall C::*)(void) const' 
1> C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr/xthread(238): note: '_Types={std::reference_wrapper<C>}' 
*/ 
} 


http://ideone.com/bxXJem built without problems 

次のコードは正しいですか?VS2015のstd :: refエラー

std::thread t8(&C::printMe, std::ref(c)); 
+0

'のstd ::スレッドT8 &c);' – cpplearner

+0

のhttps:// timsong- cpp.github.io/lwg-issues/2219 –

答えて

0

いいえ、コンパイルされません。

1)メソッドprintMeを静的メソッドとして設定してアドレス(printMeのアドレス)を送信する必要があります。それ以外の場合は、相対アドレスをインスタンスCに送信する必要があります。スレッドt8を作成し、あなたが引数としてCをオブジェクトへの参照を送信しているが、機能printMeは引数を持っていない、あなたはプリントミーメソッドに引数を宣言する必要があるの瞬間

2)。

3)@cpplearnerがあなたに言ったように、メソッドのポインタをstd::thread t8(&C::printMe, &c);として送信します。

#include <thread> 
#include <iostream> 
#include <functional> 

struct C 
{ 
    static void printMe(C* ref) 
    { 
     std::cout << "Address of C ref: " << std::hex << ref << std::endl; 
    } 
}; 

struct D 
{ 
    void operator()() const 
    { 
     std::cout << "Operator D" << std::endl; 
    } 
}; 

int main() 
{ 
    D d; 
    std::thread t9(std::ref(d)); // fine 
    t9.join(); 

    C c; 
    std::thread t8(&C::printMe, &c); // Compile in VS2015 
    t8.join(); 

    std::cout << "END" << std::endl; 
} 

、出力がある:

得られたコードである(&C ::プリントミー、

enter image description here

関連する問題