0

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です。投稿できますが、そうするかどうかはわかりません。

助けてくれてありがとう。

4

1 に答える 1

0

非静的メンバー関数 (クラスに属する関数) には、非表示の引数 (クラスのインスタンスへのポインター) があります。例としてクラスを見てみましょう。

Networking foo;
foo.TCPSocket(1000);

2 つの引数があるようには見えませんが、暗黙のうちに隠されたものがあります: object へのポインター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 を見て、「待って、オブジェクトへのポインタ整数の 2 つの引数が必要だ!」と考えています。そして、あなたがここにいるようにオブジェクトのにいるとき、オブジェクトへのポインターは何ですか? thisキーワード。すべてをまとめると:

std::thread someThread(&Networking::TCPSocket, this, 1000);

これでうまくいくはずです!

編集:

sf::ThreadC++11 Sourceをサポートしないコンパイラで使用するための単純な実装であるため、複数の引数はサポートされません。 std::threadC++11 STL ヘッダーから ` は複数の引数を適切に処理します。

于 2013-09-27T19:20:35.417 に答える