Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SFML线程错误_C++_Multithreading_Sfml - Fatal编程技术网

C++ SFML线程错误

C++ SFML线程错误,c++,multithreading,sfml,C++,Multithreading,Sfml,我试图使用SFML创建一个线程应用程序,在创建线程时遇到了这个错误 error C2064: term does not evaluate to a function taking 1 arguments 这是我的代码,它基本上是设置网络监听和接受,我试图实现的是一个可以通过main运行的网络线程 #include "Networking.h" Networking::Networking(void) { sf::Thread thread(&Networking::TCPS

我试图使用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,如果您需要标题,我可以发布它,但我不确定您是否会发布


提前感谢您的帮助。

非静态成员函数(属于类的函数)有一个隐藏参数——指向类实例的指针。让我们看一下您的班级,以获取一个示例:

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并思考“等等,我需要两个参数,指向对象的指针和整数!”当您像在这里一样在对象中时,指向对象的指针是什么?
这个
关键字。把这一切联系在一起:

std::thread someThread(&Networking::TCPSocket, this, 1000);
这应该能奏效

编辑:


sf::Thread
不支持多个参数,因为它是用于不支持C++11的编译器的原始实现std::thread将正确处理多个参数。

调用成员函数的指针时,还需要指向将调用该函数的对象的指针。但是如果我这样做,那么如何在通过
std::bind
或类似方式创建的绑定函数中添加函数argumentsPass。啊,我的错是,我认为
sf::Thread
std::Thread
的早期权宜之计。你在用什么编译器?如果它支持
std::thread
,它将修复您的所有问题。SFML实际上建议您尽可能使用
std::thread
,因为他们自己的情况在很多方面更糟:我使用的是visual Studio 2012或2013,您可以使用
#include
并使用
std::thread
而不是
sf::thread
,后者是一个更好的多线程类,支持我的答案中的代码。