cpp에서 "does not match void*(*)(void*)"에러 메시

cho's의 이미지

cpp에서 pthread를 호출합니다.
다른 pthread함수는 이상이 없는데 pthread_create함수만 다음의 메시지를 나타내며 에러가 나는군요. 당연히 멤버 함수 호출하는 함수니까 컨버젼등의 문제가 있겠지만 서도 (void*(*)(void*))나 다른 컨버젼을 해도 문제가 해결되지 않네요? 저와 같은 문제를 겪으셨던 분들 계신가요?

샘플입니다. 간단하게 제 코드의 모습을 보이자면 다음과 같습니다.

classs SampleClass{
public:
pthread_t thread;
SampleClass();
~SampleClass();
void *loop(void *param); 
};

void *SampleClass:loop(void *param)
{
    while(1){
    }
    return NULL;
}

SampleClass:SampleClass()
{
    pthread_create(&thread, NULL, loop, this)
}

exsider의 이미지

떵개 cho wrote:
cpp에서 pthread를 호출합니다.

classs SampleClass{
public:
pthread_t thread;
SampleClass();
~SampleClass();
void *loop(void *param); 
};

void *SampleClass:loop(void *param)
{
    while(1){
    }
    return NULL;
}

SampleClass:SampleClass()
{
    pthread_create(&thread, NULL, loop, this)
}

pthread_create 함수는 C함수이지요???
그리고 loop 함수는 SampleClass의 멤버함수이지요?
그러니 동작하지 않는 것이 당연합니다.
pthread_create 함수는 내부적으로 단순히 loop를 호출하려 하겠지만
SampleClass 객체없이 loop함수를 호출하는 것은 불가능합니다.
loop함수를 static 함수로 바꾸고

pthread_create(&thread, NULL, SampleClass::loop, this)

이렇게 바꿔보거나 아니면 loop를 SampleClass의 포인터를 받는 일반함수로
바꾸어보세요.

crimsoncream의 이미지

여담입니다만 제목만 보고 전처리기에서 이런 메시지도 나오나 했습니다 :)
멤버함수는 해당 class의 instance를 통해서만 refrence를 생성할 수 있으므로 loop라는 이름으로 호출된다고 해도 그건 void*(SampleClass:: )(void*)이지 void *(*)(void*)이 아니니까 type conversion으로 해결될 문제가 아니라고 봅니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.