2017-04-17 83 views
0

我想創建一個輸入處理程序使用多線程與SDL2庫;然而,當我試圖把一個線程在一個類不能編譯,給我這個錯誤...SDL2線程不工作在類

error: cannot convert 'inputHandlerClass::getInput' from type 'int (inputHandlerClass::)(void*)' to type 'SDL_ThreadFunction {aka int (*)(void*)}' 

我敢肯定,它的方式我傳遞函數名(FN)到SDL_CreateThread函數。

這是source.cpp文件

#include <iostream> 
#include <SDL.h> 
#include <SDL_image.h> 
#include <SDL_ttf.h> 
#include <SDL_thread.h> 
#include <SDL_mixer.h> 
#include "..\include\gameClass.hpp" 
#include "..\include\inputHandlerClass.hpp" 

int main(int argc, char *argv[]){ 
    inputHandlerClass inputHandler; 
    inputHandler.startThread(); 
    std::cout << "hello world"; 
    return 0; 
} 

這是inputHandlerClass.hpp

#include <SDL_thread.h> 
#include <iostream> 

class inputHandlerClass{ 
    private: 
     SDL_Thread *thread; 
     int threadReturnValue; 
    public: 
     inputHandlerClass(); 
     int getInput(void *ptr); 
     void startThread(); 
}; 

//Default Constructor 
inputHandlerClass::inputHandlerClass(){ 
    this->thread = SDL_CreateThread(getInput, "inputThread", this); 
} 

int inputHandlerClass::getInput(void *ptr){ 
    int cnt; 
    for(cnt= 0; cnt < 10; ++cnt){ 
     std::cout << "counter: " << cnt << std::endl; 
     SDL_Delay(50); 
    } 
    return cnt; 
} 

void inputHandlerClass::startThread(){ 
    SDL_WaitThread(this->thread, &this->threadReturnValue); 
} 

回答

1

SDL_CreateThread需要一個指向與int(void *ptr)簽名作爲第一個參數一個普通的功能,但是您提供一個非靜態成員函數(甚至沒有指針,因爲成員函數沒有隱式轉換爲指針)。你應該重新聲明getInput爲靜態。 this指針將以ptr提供。

+0

我試圖重新聲明爲靜態成員函數,但現在我得到以下錯誤。錯誤:不能聲明成員函數'靜態int inputHandlerClass :: getInput(void *)'有靜態鏈接[-fpermissive] –

+0

也許你已經改變了函數定義而不是聲明? – VTT

+0

我找到了一個修復程序。我正在使用gnu編譯器,並且當我向編譯器提供-fpermissive標誌時,它忽略了錯誤併成功編譯。 –