错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
error C2064: term does not evaluate to a function taking 1 arguments - something about threads
我收到此错误:
error C2064: term does not evaluate to a function taking 1 arguments
我不知道为什么,但我发现它与线程有关(如果我注释掉有关它编译的线程的行(。问题出在以下几行:
thread t(&TriviaServer::clientHandler, this->_socket);
和:
thread t(&TriviaServer::clientHandler, client_socket);
来自函数 serve(( 和 acceptClient。
我的代码:
#include "TriviaServer.h"
#define PORT 8820
#define IFACE 0
TriviaServer::TriviaServer()
{
this->_db = DataBase();
this->_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (this->_socket == INVALID_SOCKET)
throw exception(__FUNCTION__ " - socket");
}
TriviaServer::~TriviaServer()
{
for (unsigned int i = 0; i < this->_connectedUsers.size(); i++)
delete this->_connectedUsers[i];
this->_connectedUsers.clear();
for (unsigned int i = 0; i < this->_roomList.size(); i++)
delete this->_roomList[i];
this->_roomList.clear();
TRACE(__FUNCTION__ " closing accepting socket");
try
{
closesocket(this->_socket);
}
catch (exception e)
{
cout << e.what() << endl;
}
catch (...) {}
}
void TriviaServer::serve()
{
bindAndListen();
thread t(&TriviaServer::clientHandler, this->_socket);
t.detach();
while (true)
{
TRACE("accepting client...");
acceptClient();
}
}
void TriviaServer::bindAndListen()
{
struct sockaddr_in sockAddr = { 0 };
sockAddr.sin_port = PORT;
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = IFACE;
if (::bind(this->_socket, (struct sockaddr*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)
throw exception(__FUNCTION__ " - bind");
TRACE("binded");
if (::listen(this->_socket, SOMAXCONN) == SOCKET_ERROR)
throw exception(__FUNCTION__ " - listen");
TRACE("listening...");
}
void TriviaServer::acceptClient()
{
SOCKET client_socket = accept(this->_socket, NULL, NULL);
if (client_socket == INVALID_SOCKET)
throw exception(__FUNCTION__);
TRACE("Client accepted !");
thread t(&TriviaServer::clientHandler, client_socket);
t.detach();
}
void TriviaServer::clientHandler(SOCKET)
{
//TODO
}
有人知道原因以及如何解决吗?
thread t(&TriviaServer::clientHandler, this->_socket);
由于&TriviaServer::clientHandler
定义为:
TriviaServer::clientHandler(SOCKET);
通过函数指针传递给调用的第一个参数 &TriviaServer::clientHandler
是 TriviaServer
类型的隐式this
参数,或指向 TriviaServer
对象的指针。您需要在函数声明采用的任何其他参数之前传递它。所以你想做:
thread t(&TriviaServer::clientHandler, this, this->_socket);
相关文章:
- 多线程:线程或进程.h - C++
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- C++中的多线程:连接线程的正确方法
- 适用于大型数组的无复制线程安全环形缓冲区
- BOOST线程:线程还是进程
- __thread Embarcadero c++ 10.1 中不创建特定于线程的变量
- 如何在线程线程内部制作内存?
- C++ - 多线程 - 线程之间的通信
- C++多线程:线程安全的内存分配
- C 线块主线程
- 矢量扩展和线程例程
- 如何确定流程的"经理"和"工作线程"线程的优先级(或为其设置调度策略)?
- 是boost::线程线程安全的
- c++多线程-线程安全的代码
- 依靠额外的线程-线程安全
- 如何在不使用全局变量的情况下通知外部线程主线程状态
- Linux多线程——线程不会产生任何预期的输出
- 线程-线程创建问题
- Boost:如何处理依赖于时间的线程操作
- 传递线程例程多个变量和堆栈大小