2016-08-05 2 views
1

От того, что я искал, мой синтаксис верен, но мой компилятор (VS2015) жалуется. Обратите внимание: я использую пространство имен ee с классом Network. Вот код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 'станд :: Тема :: Тема': нет перегруженной функция принимает 2 аргумент

  2. а не экземпляр конструктора «СТД :: thread :: thread "соответствует списку аргументов

У кого-нибудь есть представление о том, что может случиться в этой ситуации?

+1

Возможно, не столь глупый вопрос, вы включили '' , верно? Нам здесь не с чем поработать. – WhozCraig

+1

Это похоже на код ошибки Visual C++ - какую версию вы используете? –

+3

Кроме того, у вас есть проблема двусмысленности. Попробуйте 'void (ee :: Network :: * threadProc)() = & ee :: Network :: clientRun; thread clientThread (threadProc, new ee :: Network); ' –

ответ

3

Предложение Бена исправило мою проблему, но я не уверен, почему.

Проблема с первым аргументом &ee::Network::clientRun. clientRun имеет 2 перегрузки, но в точке вывода шаблона (для вывода типов аргументов std::thread::thread<>) компилятор еще не в состоянии отличить, какая из перегрузок более допустима.

решение Бен работал, потому что бросок перед вызовом сделал работу составителей для него - указав тип Network::clientRun быть void (ee::Network*)(void), а не равноценны void (ee::Network*)(string).

Некоторые примеры:

#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); 
} 
Смежные вопросы