2013-09-27 100 views
0

我正在嘗試使用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::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

但是,如果我這樣做,那麼我該如何添加函數參數 –

+0

傳遞通過'std :: bind'或類似方法創建的綁定函數。 –

回答

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`將正確處理多個參數。

+0

這是行不通的,因爲它不能取3個參數 –

+0

啊,我的錯,我認爲'sf :: Thread'是'std :: thread'的一個早期的停止位。你使用什麼編譯器?如果它支持'std :: thread',它會解決你所有的問題。如果可能的話,SFML實際上建議你使用'std :: thread',因爲它們在很多方面都會變得更糟:http://www.sfml-dev.org/tutorials/2.0/system-thread.php –

+0

我使用visual工作室 –