콜백

2013-04-08 2 views
0

내가 부스트를 실행하려고 한 또 다른 객체의 기능을 스레드 실행 부스트를 사용하는 방법 ::이 같은 함수가있는 클래스 A의 콜백콜백

일부 개체 기능을 스레드 홈페이지에서 :

int SomeCallback(float variable) 
{ 
    int result; 
    cout<<"Callback called"<<endl; 
    //Interpret variable 

    return result; 
} 



int main(){ 
    A* file = new A(); 

boost::thread bt(&A::DoWork, file , &SomeCallback); 
cout<<"Asyns func called"<<endl; 
bt.join(); 
cout<<"main done"<<endl; 
} 

링커에게 오류가 발생 boost::thread bt(&A::DoWork, file , &SomeCallback); 라인입니다. 이 튜토리얼에서 사용한이 호출은 http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html입니다.

오류 :

unresolved external symbol "public: void __thiscall A::DoWork(int (__cdecl*)(float))" ([email protected]@@[email protected]@Z) referenced in function _main 

이 코드에 어떤 문제가 있습니까?

+0

'DoWork'에서'콜백'이 사용 되었습니까? –

+0

비동기 요구 사항에 대해 [boost.asio] (http://www.boost.org/libs/asio/)에 관심이있을 수 있습니다. –

+1

@DrewDormann 필자는 typo/copy 에러 인'f'와'callback'이 거의 동일하다고 생각합니다. –

답변

2

해결되지 않은 외부 기호은 링커 오류입니다. 즉 링커에서 A::DoWork의 정의를 찾을 수 없습니다. 코드에서 실제로 함수를 정의한 위치를 볼 수는 없지만 다음과 같이 추측 해 봅니다.

//A.h 

class A { 
    //... 
public: 
    void DoWork(int (*callback)(float)); //declaration 
}; 

//A.cpp 

void DoWork(int (*callback)(float)) 
{ 
    float variable = 0.0f; 

    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    int result = f(variable); 
} 

즉. 의 정의가 .cpp 파일에 올린 내용과 정확히 일치하면 A::DoWork을 정의하지 않고 대신 새로운 무료 함수를 정의한다는 오류가 발생합니다.

올바른 정의는 다음과 같다 : 내 생각이 잘못되면 우리가 진짜 문제가 무엇인지 평가할 수 있도록

//A.cpp 

void A::DoWork(int (*callback)(float)) //define it as a member of A! 
{ 
    float variable = 0.0f; 

    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
    int result = f(variable); 
} 

, SSCCE을 제공하십시오.

+0

두 번째 추측은 맞습니다. (부끄러움) – rank1

+0

헤더에서 cpp로 함수 서명을 복사하고 'A : :'- 미해결 ​​참조를 얻는다면 찾아야 할 첫 번째 것 중 하나입니다. –

+0

예, 복사 중이었습니다. 많은 감사합니다. 그리고 Main.cpp에 정의되는 대신 SomeCallback 메서드를 호출하고자한다면 클래스 A의 일부로 정의됩니다. 이번에는 메서드를 올바르게 정의하고 컴파일 오류가 발생합니다. boost :: thread bt (& A :: DoWork, file, & A :: SomeCallback);를 사용하여 이것을 실행하려고합니다. – rank1