2014-06-09 2 views
0

편집 : 올바른 제목은 "기본 클래스에서 오버로드 된 실제 가상 함수 호출"이었습니다. 문제의 큰 부분 이었기 때문입니다.기본 클래스의 실제 가상 함수 호출

나는 실제 가상 기능과 다른 정상적인 기능을 가진 기본 클래스를 가지고 있습니다. 하나는 정상적인 것들은 스레드에서 가상 함수를 호출하고, 나는 이해가 안되는 그 라인에 오류가 발생합니다. 나는 그것이 스레드와 관련이 있다고 생각하지만 기본 클래스는 추상 클래스이고 모든 파생 클래스는 실제로 가상 함수를 구현해야하므로 문제가 없어야합니다. 어쩌면 완전히 다른 무언가 일 수 있습니다.

class Base { 
    virtual int getInfo(int a) = 0; // the culprit? 

    void getInfo();   // is implemented, calls getInfo(int); Does 
          // actually have the same name. Works perfectly fine. 

    void getThreadedInfo(); // for details, see below 

} 

// ..later.. 

Base::getThreadedInfo() { 
    ... 
    for(int i=0; i<maxThreads; i++) { 
     threads.push_back(thread(getInfo, i)); // this is line 85 
    } 
    ... 
} 

전체 오류 메시지는 다음과 같습니다 : 이것은 어떻게 생겼는지 더 많거나 적은 &Base::getInfo

threads.push_back(std::thread(static_cast<int (Base::*)(int)>(&Base::getInfo), this, i)); 

가 모호 :

Error 1 error C3867: 'Base::getInfo': function call missing argument list; use '&Base::getInfo' to create a pointer to member 
c:\path\to\base.cpp 85 1 Project 

Error 2 error C2661: 'std::thread::thread' : no overloaded function takes 2 arguments 
c:\path\to\base.cpp 85 1 Project 

답변

1

당신은 같은 것을 사용할 수있다.

+0

과부하가 문제 일 수 있다고 생각했습니다. 어떻게 완료했는지 알려 주셔서 감사합니다. – Arne

+0

그에 따라 모든 것을 변경했습니다. – Arne

1

당신은 몇 가지 다른 일이 있습니다. 당신은 함수 포인터를 만들 thread의 인수 목록에서 getInfo으로 & 연산자를 사용합니다 - 수정

첫 번째, 간단한 한 첫 번째 오류 메시지에 대해 말하고있는 것입니다.

두 번째 문제는 getInfothread의 컨스트럭터를 호출 할 때 추가 인수가 필요하다는 것입니다. int a 외에도 getInfo은 정적이 아니기 때문에 암시적인 Base* this을 사용합니다. 따라서 this을 추가해야합니다.

세 번째로 가장 까다로운 문제는 Base에 두 개의 오버로드가 getInfo이므로 두 가지 중 하나를 원하는대로 명시해야한다는 것입니다.

세 가지를 모두 합치면 입력 할 때 정확히 this answer이 있어야합니다. :)

+0

& 'this'인수를 왜 추가해야하는지 알 수 없습니다. cplusplus.com의 스레드 문서에서 std :: thread second (bar, 0); // bar (0)를 호출하는 새 스레드를 생성합니다. 그것은 멤버 함수를 호출하기 때문입니까? 그렇다면 왜 그렇게 작동합니까? – Arne

+0

이런 식으로 생각해보십시오 :'this'를 넘겨주지 않았다면 컴파일러는'Base' 객체에서'getInfo'를 호출하기를 원합니다. 함수를'o.getInfo (3)'과 같은 일반적인 방법으로 호출하면, 연산자의 왼쪽에있는 객체가'this'로 사용되어야한다는 것은 명백합니다. 그러나 함수를 일반적으로 사용할 때는'this'의 값을 명시 적으로 제공해야합니다. – dlf

+0

내 이전 의견은 귀하의 질문의 절반 만 해결했습니다. 나머지 절반 ('&')에 대한 응답으로 네, 차이점은 여기에 멤버 함수를 다루는 것입니다. – dlf

관련 문제