2011-03-09 4 views
4

기본 클래스에서 템플릿이 아닌 멤버 함수를 호출 할 때 using이라는 이름을 파생 클래스에 가져온 다음 사용할 수 있습니다. 기본 클래스의 템플릿 멤버 함수에도 가능합니까?템플릿 기본 클래스에서 템플릿 멤버 함수를 호출하는 방법은 무엇입니까?

그냥 using으로는 (++ g로 - 스냅 샷-20110219 -std = C + +0) 작동하지 않습니다

template <typename T> 
struct A { 
    template <typename T2> void f() { } 
}; 

template <typename T> 
struct B : A<T> { 
    using A<T>::f; 

    template <typename T2> void g() { 
    // g++ throws an error for the following line: expected primary expression before `>` 
    f<T2>(); 
    } 
}; 

int main() { 
    B<float> b; 
    b.g<int>(); 
} 

나는 알고에서 명시 적으로 기본 클래스 접두어

A<T>::template f<T2>(); 

잘 작동하지만 질문은 다음과 같습니다. 단순한 선언을 사용하거나 사용하지 않고도 가능합니다 (f이 템플릿 함수가 아닌 경우와 동일).

이럴 수없는 경우 그 이유를 아는 사람이 있습니까?

답변

9

이 (말장난 의도) 작동 : this->template f<T2>();

그래서 using 템플릿에 의존하는 템플릿 기능이 작동하지 않습니다 왜

template <typename T> 
struct B : A<T> { 
    template <typename T2> void f() 
    { return A<T>::template f<T2>(); } 

    template <typename T2> void g() { 
    f<T2>(); 
    } 
}; 

은 매우 간단하지 않습니다 - 문법하지 않습니다 그 맥락에서 필요한 키워드를 허용하십시오.

+0

+1, 그리고 말장난의 신음 소리 : – dappawit

+0

감사합니다 ,하지만 두 솔루션 모두 두 질문 모두'A :: template f ()'을 먼저 쓰는 것보다 쉽지 않으므로 답해주십시오. – Lars

+0

나는 이것이 '맛'의 문제 일지라도 '더 간단하다'고 생각합니다. 그러나 가상 함수가 예상대로 작동 할 수도 있습니다 (그러나 여기서는 문제가 아님). – dappawit

0

내가 사용한다고 생각 :

this->A<T>::template f<T2>();

나 :

this->B::template f<T2>();