使用带 ref 参数的成员函数创建线程时出现编译错误
compilation error when creating a thread with a member function with ref argument
我正在尝试做一个 std::tread 所以我已经看了一些教程但是当我做同样的事情时(我认为)它没有编译。
这是我的Network_class,"receiveFromServer"成员函数应该是线程函数。
class Network_ {
public:
bool errorInfo(sf::Socket::Status status) {
switch (status)
{
case sf::Socket::Done:
return true;
break;
case sf::Socket::NotReady:
std::cout << "The socket is not ready to send / receive data yet." << std::endl;
return false;
break;
case sf::Socket::Partial:
std::cout << "The socket sent a part of the data." << std::endl;
return false;
break;
case sf::Socket::Disconnected:
std::cout << "The socket has been disconnected." << std::endl;
return false;
break;
case sf::Socket::Error:
std::cout << "An unexpected error happened." << std::endl;
return false;
break;
default:
return false;
break;
}
}
void receiveFromServer(sf::RenderWindow &RW) {
sf::Packet packet;
std::string string;
while (RW.isOpen())
if (_selector.wait() && _selector.isReady(_socket)) {
if (errorInfo(_socket.receive(packet))) {
packet >> string;
packet.clear();
std::cout << string << std::endl;
}
}
else
RW.close();
}
private:
sf::SocketSelector _selector;
sf::TcpSocket _socket;
这是我主要内容的一部分
Network_ network;
if (network.connectToServer(ip, port)) {
Window_ window;
sf::RenderWindow *RW = window.create_window("test", 10);
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW));
return gameLoop(*RW);
}
我得到了这个错误 static assertion failed: std::thread arguments must be invocable after conversion to rvalues
,下面有很多废话。
有人可以帮我吗?谢谢:)
您的 receiveFromServer
函数需要对 sf::RenderWindow
的引用,但您传递的是 sf::RenderWindow*&
。
这里有几种解决方案。
按值传递,因为它只是一个指针
void receiveFromServer(sf::RenderWindow* RW) // sf::RenderWindow* instead of sf::RenderWidnow&
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, RW); // pass by value
按引用传递 - 没用
void receiveFromServer(sf::RenderWindow*& RW) // sf::RenderWindow*& instead of sf::RenderWidnow&
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW)); // pass by reference
通过引用传递而不改变你的函数
void receiveFromServer(sf::RenderWindow& RW) // no change
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(*RW)); // dereference and pass by reference
我正在尝试做一个 std::tread 所以我已经看了一些教程但是当我做同样的事情时(我认为)它没有编译。
这是我的Network_class,"receiveFromServer"成员函数应该是线程函数。
class Network_ {
public:
bool errorInfo(sf::Socket::Status status) {
switch (status)
{
case sf::Socket::Done:
return true;
break;
case sf::Socket::NotReady:
std::cout << "The socket is not ready to send / receive data yet." << std::endl;
return false;
break;
case sf::Socket::Partial:
std::cout << "The socket sent a part of the data." << std::endl;
return false;
break;
case sf::Socket::Disconnected:
std::cout << "The socket has been disconnected." << std::endl;
return false;
break;
case sf::Socket::Error:
std::cout << "An unexpected error happened." << std::endl;
return false;
break;
default:
return false;
break;
}
}
void receiveFromServer(sf::RenderWindow &RW) {
sf::Packet packet;
std::string string;
while (RW.isOpen())
if (_selector.wait() && _selector.isReady(_socket)) {
if (errorInfo(_socket.receive(packet))) {
packet >> string;
packet.clear();
std::cout << string << std::endl;
}
}
else
RW.close();
}
private:
sf::SocketSelector _selector;
sf::TcpSocket _socket;
这是我主要内容的一部分
Network_ network;
if (network.connectToServer(ip, port)) {
Window_ window;
sf::RenderWindow *RW = window.create_window("test", 10);
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW));
return gameLoop(*RW);
}
我得到了这个错误 static assertion failed: std::thread arguments must be invocable after conversion to rvalues
,下面有很多废话。
有人可以帮我吗?谢谢:)
您的 receiveFromServer
函数需要对 sf::RenderWindow
的引用,但您传递的是 sf::RenderWindow*&
。
这里有几种解决方案。
按值传递,因为它只是一个指针
void receiveFromServer(sf::RenderWindow* RW) // sf::RenderWindow* instead of sf::RenderWidnow&
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, RW); // pass by value
按引用传递 - 没用
void receiveFromServer(sf::RenderWindow*& RW) // sf::RenderWindow*& instead of sf::RenderWidnow&
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(RW)); // pass by reference
通过引用传递而不改变你的函数
void receiveFromServer(sf::RenderWindow& RW) // no change
{ /* ... */}
std::thread receiveThread(&Network_::receiveFromServer, &network, std::ref(*RW)); // dereference and pass by reference