我正在尝试使用SFML创建一个线程化的应用程序,在创建一个线程时,我遇到了这个错误。
error C2064: term does not evaluate to a function taking 1 arguments
这是我的代码,它基本上做的是设置网络侦听和接受,我想要实现的是一个网络线程,我可以通过main
运行。
#include "Networking.h"
Networking::Networking(void)
{
sf::Thread thread(&Networking::TCPSocket, 1000);
thread.launch();
}
Networking::~Networking(void)
{
SetNetworking(false);
}
void Networking::TCPSocket(int port)
{
InitNetworking();
sf::TcpSocket client;
sf::TcpListener listener;
// bind the listener to a port
if (listener.listen(port) != sf::Socket::Done)
{
Logger::Wrn("Could not bind to port:", port);
} else {
Logger::Log("Successfully bound to port:", port);
}
Logger::Log("Ready to receive connections");
while(IsNeworkRunning() == true)
{
if(listener.accept(client) == sf::Socket::Done)
{
Logger::Log("New connection received from");
} else {
Logger::Wrn("Connection from", client.getRemoteAddress(), "could not connect");
}
}
}
void Networking::SetNetworking(bool i)
{
i = this->_networkStarted;
}
bool Networking::IsNeworkRunning()
{
if(_networkStarted == false)
{
Logger::Err("Failed to initialise the networking");
exit(EXIT_FAILURE);
} else {
return _networkStarted;
}
}
void Networking::InitNetworking()
{
SetNetworking(true);
Logger::Log("Network initialised");
}
如果您需要标题,那么错误来自的.cpp我可以发布它但我不确定您会不会。
提前感谢您的帮助。
答案 0 :(得分:0)
非静态成员函数(属于某个类的函数)具有隐藏参数 - 指向该类实例的指针。让我们看一下你的课程:
Networking foo;
foo.TCPSocket(1000);
虽然它没有看起来就像有两个参数一样,但隐含一个隐藏的参数:指向对象foo
的指针。在C风格的OOP代码中,通过函数获取指向对象和任何参数的指针可以实现相同的功能,因此您可以编写:
CStyleTCPSocket(&foo, 1000);
在C ++中,事情的工作方式类似,但是有一些语法糖可以使事情看起来更漂亮。电话:
foo.TCPSocket(1000);
变成了:
Networking::TCPSocket(&foo, 1000); //not legal code, it's just to make a point
那你怎么解决你的问题呢?当你启动这样的线程时:
std::thread someThread(&Networking::TCPSocket, 1000);
编译器正在查看TCPSocket并且想“等待,我需要两个参数,指向对象的指针和整数!”当你在对象中时,指向对象的指针是什么? this
个关键字。把它们捆绑在一起:
std::thread someThread(&Networking::TCPSocket, this, 1000);
这应该可以解决问题!
修改强>
sf::Thread
不支持多个参数,因为它不适合与不支持C ++ 11 Source的编译器一起使用。来自C ++ 11 STL头文件的std::thread
将正确处理多个参数。