2017-03-14 14 views
3

대신 기본 클래스의 기능 (좌변)의 파생 클래스에서 메서드 호출 (좌변) 함수 바인딩 (를 rvalue) : 내가 한C++ 나 C에 새로운 오전 ++ 아래로 인터페이스를 작성하려고

template <class T> 
class Comparable 
{ 
    protected: 
     Comparable(){}; 
    public: 
     virtual int compare(const T&&)=0; 
     int compare(const T& o) 
     { 
     return this->compare(std::move(o)); 
     } 
}; 

이것은 l/r 값으로 작업 할 compare 메소드를 얻으려고 시도하는 것입니다.

Monkey m1(argv[1]), m2(argv[2]); 
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1)); 

을하지만 컴파일 오류 얻을 : 다음과 같이 main() 메소드로

class Monkey : Comparable<Monkey> 
{ 
    private: 
     char name[512]; 
    public: 
     Monkey(const char*&& name) 
     { 
     strcpy(this->name, name); 
     } 
     const char *getName() { return name; } 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 

:

바인딩 할 수 없습니다 '테스트를 :: 원숭이를 나는 대등에서 다음 클래스를 파생 'lvalue to'const 테스트 :: Monkey & & ' 'virtual int '의 테스트 인수 :: Monkey :: compare (const 테스트 :: Monkey & &) ' 빌드 실패

메서드 호출이 기본 클래스의 비교 메서드에 바인딩되지 않는 이유는 무엇입니까?

내가 기본 클래스에서 가상으로 생성하고 파생 클래스에서 둘 다 작성하면 바인딩이 제대로 작동하지만 작동하지 않고 작성시 컴파일하려고하면 컴파일 오류가 발생합니다. 이리.

+0

난 정말 당신이를 rvalue 참조를 사용하는 이유 표시되지 않습니다 어디에나. 'compare' 함수에 대한 일반적인 const-reference는 잘 작동합니다. 그리고 rvalue reference를'const char *'에 건네 주겠습니까? 그건별로 의미가 없습니다. 마지막으로 상수 값은 종종 의미가 없습니다. –

+0

저는 C++을 처음 접했습니다. 나는 참조가 함수 호출의 기본 동작 인 복사를 방지한다고 생각하므로 사용하는 습관에 빠져 익숙해지는 것이 좋은 습관이라고 생각했습니다. 그리고 이전에 const 참조를 보았습니다. 성능에 미치는 영향은 미미할지라도. –

+0

@JoePaul Reference는 [overhead] (http://stackoverflow.com/questions/8250932/what-is-the-overhead-of-passing-a-reference)도 소개합니다. const lvalue 레퍼런스는 당신의 경우에 perferect를 할 것입니다. rvalue 참조는 주로 완벽한 전달 및 이동 의미에 사용됩니다. – felix

답변

3

이름 숨기기입니다. 파생 클래스의 name은 기본 클래스의 이름을 숨 깁니다. 요컨대, 다른 범위를 통해 함수를 오버로드 할 수 없습니다. unqualified name lookup의 규칙에 따라

, m2.compare(m1) 들어 m2 유형 Monkey이다은 이름 compare이 먼저 도출 클래스 Monkey의 범위에서 발견 될 것이며, 다음 조회 정지 이름. 기본 클래스의 compare은 다음 과부하 해결을 위해 고려되지 않습니다.

(강조 광산)

For an unqualified name, that is a name that does not appear to the right of a scope resolution operator ::, name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

당신은 using에 의해 파생 된 클래스의 범위에 기본 클래스의 이름을 소개 할 수 있습니다

class Monkey : Comparable<Monkey> 
{ 
     ... 

     using Comparable<Monkey>::compare; 
     int compare(const Monkey&& m) 
     { 
     return strcmp(name, m.name); 
     } 
}; 
+0

감사합니다. 그 질문에 대답했다. –