2012-07-14 6 views
0

가능한 중복 :
overloaded functions are hidden in derived class수 없습니다

그들이 모두에 과부하 경우 내가 직접 파생 클래스에서 기본 클래스에서 메서드를 사용할 수 없습니다 것 같다 기본 클래스 및 C++의 파생 클래스 다음 코드는 no matching function for call to ‘Derived::getTwo()’ 오류를 생성합니다.

class Base { 
public: 
    int getTwo() { 
     return 2; 
    } 
    int getTwo(int, int) { 
     return 2; 
    } 
}; 

class Derived : public Base { 
public: 
    int getValue() { 
     // no matching function for call to ‘Derived::getTwo()’ 
     return getTwo(); 
    } 
    int getTwo(int) { 
     return 2; 
    } 
}; 

나는 return getTwo();return ((Base*) this)->getTwo()에 변경, 작동,하지만 그건 나에게 추한 보인다면. 이 문제를 어떻게 해결할 수 있습니까?

P. g ++ 4.7을 옵션 std = gnu ++ c11과 함께 사용합니다.

+0

이것은 확실히 중복으로 닫힐 것이다. 그러나 그 동안 빠른 대답은 클래스 scope의'Derived' 정의에'Using Base :: getTwo'를 추가하는 것입니다. – ildjarn

답변

1

다음 중 하나를

class Derived : public Base { 
public: 
    using Base::getTwo; // Add this line 
    int getValue() { 
     // no matching function for call to ‘Derived::getTwo()’ 
     return getTwo(); 
    } 
    int getTwo(int) { 
     return 2; 
    } 
} 

또는

 return Base::getTwo(); 
+0

감사합니다. 왜 이것이 효과가 있는지 설명해 주시겠습니까? 아니면 그렇지 않은 이유는 무엇입니까? – RPFeltz

+0

@RPFeltz : * 숨기기 *라고합니다. 기본적으로 프로세스는 가장 가까운 컨텍스트 ('getValue()'method + ADL 내부에서 시작)에서 시작하여'getTwo()'가 발견되지 않으면 찾으려고합니다 , 그 다음 스코프가 검사되는 등등. 한 컨텍스트에서 식별자를 찾으면 검색을 중지합니다. 귀하의 경우 클래스 내에서'int getTwo (int)'를 찾았으므로 기본 클래스에서 다른 오버로드를 조사하지 않습니다. 두 가지 대안은 다음과 같습니다. 기본 오버로드를'using base :: getTwo; '를 사용하여 파생 클래스 범위로 가져 와서 클래스에서 사용할 수 있도록합니다 ... –

+0

... 그러면 오버로드 해상도가 가장 적합한 초과 적재. 또 다른 해결책은'base :: getTwo()'로 호출을 한정하는 것입니다. 그러면 컴파일러에게 기본 클래스 컨텍스트에서'getTwo()'를 원한다는 것을 알려줍니다 (즉, 현재 범위에서 룩업을 시작하지 말고'getTwo '내부'base') –

0

이 작동 ++ C의 이름 조회하는 방법입니다

namespace N1 
{ 
    int getTwo(); 
    int getTwo(int, int); 

    namespace N2 
    { 
     int getTwo(int); 

     namespace N3 
     { 
      call getTwo(something char*); 
     } 
    } 
} 

현재의 상황은 N3입니다. 이 레이어에는 getTwo이 없습니다. 좋아, 상위 레이어로 이동하십시오. N2는 getTwo에 대한 하나의 정의를 포함합니다. 컴파일러는이 정의를 사용하려고 시도하고 상위 컨텍스트를 검색하지 않습니다. N2의 getTwo은 모든 상위 계층의 getTwo에 대한 모든 정의를 숨 깁니다. 때로는 오버로드 된 메서드와 혼동을 일으킬 수 있습니다.

using Base::getTwo;을 추가하면 실제로 내부 컨텍스트에 정의 프록시가 추가됩니다. 상부 상황 템 셀의 정의는 보이지 않습니다. 그러나 프록시가 보입니다.