1

所以我试图通过 SFML 创建一个线程,但我的代码只是产生了一个错误,我已经尝试修复了几个小时。

这是我不断收到的错误:

    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>          ]

这是我的线程代码

#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;
}

线程.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() {};
};

所以我需要的是修复或解释这里发生的事情我已经尝试了我能想到的一切来解决这个问题

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()
    {
    
    }
    

有关更多信息,请参阅此问题:

在一个类中使用具有成员函数的通用 std::function 对象

编辑:此外,如果您不使用赋值运算符并直接调用构造函数,那么您当前的语法将起作用。

所以:

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

不是:

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