1

だから私はSFMLを介してスレッドを作成しようとしていますが、私のコードはエラーを生成しているだけで、何時間も修正しようとしていました.

This is the error i keep getting:

    d:\c++\engine\deps\sfml-2.1\include\sfml\system\thread.inl(39): error C2064: term does not evaluate to a function taking 0 arguments
1>          d:\c++\engine\deps\sfml-2.1\include\sfml\system\thread.inl(39) : while compiling class template member function 'void sf::priv::ThreadFunctor<T>::run(void)'
1>          with
1>          [
1>              T=Thread *
1>          ]
1>          d:\c++\engine\deps\sfml-2.1\include\sfml\system\thread.inl(70) : see reference to class template instantiation 'sf::priv::ThreadFunctor<T>' being compiled
1>          with
1>          [
1>              T=Thread *
1>          ]
1>          d:\c++\engine\src\engine\thread.cpp(20) : see reference to function template instantiation 'sf::Thread::Thread<Thread*>(F)' being compiled
1>          with
1>          [
1>              F=Thread *
1>          ]

And here is my thread code

#include "Thread.h"

Thread::Thread(void)
{
    threadRunning = false;
}

ThreadException::ThreadException(string err)
{
    this->err = err;
}

void Thread::Begin()
{
    if(threadRunning == true) {
        throw ThreadException("Thread already running");
    }

    threadRunning = true;
    sf::Thread thread = (&Thread::ThreadProc, this);
    thread.launch();
}

bool Thread::IsRunning()
{
    return threadRunning;
}

Thread.cpp

#pragma once

#include <SFML\System.hpp>
#include <iostream>
using namespace std;

class Thread
{
private:
    bool threadRunning;
public:
    void Begin();

    Thread();

    bool IsRunning();

    void ThreadProc();
};

class ThreadException : public exception
{
public:
    const char * what() const throw()
    {
        return "Thread Exception";
    }
    std::string err;
    ThreadException(string err);
    ~ThreadException() throw() {};
};

So what i need is the fix or an explanation to what is going on here i have tried literally everything i can think of to fix this

4

1 に答える 1

0
  1. 関数バインディングが間違っています。
  2. 正しくバインドされていれば、"this" 引数は必要ありません。
  3. ThreadProc 関数の実装を提供していません。

    void Thread::Begin()
    {
        if(threadRunning == true) 
            {
                throw ThreadException("Thread already running");
            }
    
        threadRunning = true;
    
        std::function<void(void)> f = std::bind(&Thread::ThreadProc, this);
    
        sf::Thread thread = (f); // Don't need to use = here either, just call the ctor directly
        thread.launch();
    }
    
    void Thread::ThreadProc()
    {
    
    }
    

詳細については、この質問を参照してください。

1 つのクラスでメンバ関数を持つジェネリック std::function オブジェクトを使用する

編集:また、代入演算子を使用せずにコンストラクターを直接呼び出すと、現在の構文が機能します。

そう:

sf::Thread thread(&Thread::ThreadProc, this);

いいえ:

sf::Thread thread = (&Thread::ThreadProc, this);
于 2013-09-06T12:59:39.170 に答える