2017-04-17 1 views
0

SDL2 라이브러리로 멀티 스레딩을 사용하여 입력 처리기를 만들려고합니다. 나는 ... 그것을 컴파일하고 날이 오류를 제공하지 않습니다 클래스에SDL2 스레드가 클래스 내부에서 작동하지 않습니다.

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

을 스레드를 넣어하려고 할 때 그러나, 나는 그 길을 내가 함수 이름 (FN)을 통과하고 있다는 확신 SDL_CreateThread 함수에 전달합니다.

그러나 당신이 제공하는

#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) 서명이있는 일반 함수에 대한 포인터를 기대하는 source.cpp 파일입니다 비 정적 멤버 함수 (멤버 함수가 암시 적으로 포인터로 변환되지 않기 때문에 포인터가 아닙니다). getInput을 정적으로 다시 선언해야합니다. this 포인터는 ptr으로 사용할 수 있습니다.

+0

정적 멤버 함수로 다시 선언했지만 이제 다음 오류가 발생합니다. 오류 : 멤버 함수 'static int inputHandlerClass :: getInput (void *)'을 정적 링크로 선언 할 수 없습니다. [-fpermissive] –

+0

선언 대신 함수 정의를 변경했을 수 있습니까? – VTT

+0

해결책을 찾았습니다. 나는 gnu 컴파일러를 사용하고 있었고 컴파일러에게 -fpermissive 플래그를 주면 오류를 무시하고 성공적으로 컴파일되었습니다. –

관련 문제