2012-05-06 2 views
0

int와 int 모두를 사용하는 컨테이너를 작성하려고합니다 &. 하나 개의 클래스에서 그 일을 작동 :기본 클래스에서 오버로드 된 함수는 필요하지 않지만 절대 호출되지 않습니다.

template <class T> 
class unified_class 
{ 
public: 
    virtual void f(T &i){} 
    virtual void f(T &&i) {} 
}; 

전화 :

unified_class<int> u; 
u.f(8); // going to the second method 
int a = 9; 
u.f(a); // going to the first method 

하지만이 벌어지고 난, 두 클래스 사이에 분할 이상한 무언가를 시도하고있다 :

template <class T> 
class base_class 
{ 
public: 
    virtual void f(T &&i) { /* it never reaches here*/} 
}; 

template <class T> 
class derived_class : public base_class<T> 
{ 
public: 
    using base_class<T>::f; 
    virtual void f(T &i){} 
}; 

이전과 같은 함수 호출을 호출하면 두 경우 모두 파생 클래스의 f()가 호출됩니다.

내가 무엇인가 놓친가요?

+3

어떤 컴파일러를 사용합니까? 나는 gcc 4.6.3으로 잘 컴파일한다. – user2k5

+0

Visual Studio 2010을 사용하고 있습니다 – wolfovercats

답변

1

g ++ 4.6.3에서 문제가 표시되지 않습니다. 이것은 내가 사용하는 코드입니다 :

#include <iostream> 

using std::cerr; 

template <class T> 
class base_class 
{ 
public: 
    virtual void f(T &&i) { cerr << "base_class\n"; } 
}; 

template <class T> 
class derived_class : public base_class<T> 
{ 
public: 
    using base_class<T>::f; 
    virtual void f(T &i) { cerr << "derived_class\n"; } 
}; 

int main(int argc,char **argv) 
{ 
    derived_class<int> u; 
    u.f(8); // going to the second method 
    int a = 9; 
    u.f(a); // going to the first method 
} 

나는이 결과를 가지고 : 당신이 정말이 확실히 당신은 당신이 다음 게시 한 코드로 말할 결과를보고하는 경우

base_class 
derived_class 
+0

Visual Studio로 코드를 실행하면 다음과 같이 나타납니다. derived_class derived_class – wolfovercats

1

을 컴파일러 버그. T가 "int"일 때 f (T &)를 상수로 호출 할 수 없어야합니다. 어떤 종류의 숨김이 있었지만, 사용하는 것이 그렇게 처리된다고 생각합니다. 프로그램은 잘못된 함수를 호출하기보다는 컴파일하는 데 완전히 실패해야합니다.

1

임시로 비 구속 참조에 바인딩되는이 기능을 제공하는 Visual Studio 2010을 사용하고 있습니다. 두 경우 모두 T& 버전을 호출하는 이유입니다. 이 컴파일러 확장자 ​​컴파일러 버그으로 지정해야합니다. 왜냐하면 은 표준에 정의 된 동작을으로 바꾸기 때문입니다.

그러나, 표준 C++의 비 CONST 기준에 바인딩 할 필요가있어 호출 인수로 T&&를 취하는 함수로 해석해야 적분 리터럴 8에서 작성한 임시 객체이다.

관련 문제