2016-06-22 4 views
0

질문은 코드입니다. 두 번째 기능이 첫 번째 기능보다 더 특수한 것처럼 보입니다. 왜 더 일반적인 코드가 다음 코드에서 호출됩니까? 다른 기능을 사용하려면 어떻게해야합니까?함수 템플릿의 과부하 해결

template <typename T> 
class Base{ 
public: 
    Base(){} 
    void print() const {cout<<"Base class"<<endl;} 
}; 

template <typename T> 
class Derived :public Base<T>{ 
public: 
    Derived() {} 
    void print() const {cout<<"Derived class"<<endl;} 
}; 

template <typename T> 
void func(T x){ // <----- Why is function is called? 
    x.print(); 
    cout<<"in func(T)"<<endl; 
} 

template <typename T> 
void func(const Base<T>& x){ 
    x.print(); 
    cout<<"in func(Base<T>)"<<endl; 
} 

int main() { 
    Base<int> b; 
    Derived<int> d; 
    func(d); 
    return 0; 
} 

파생 된 개체를 함수에 전달 중입니다.

+0

이 게시물은 당신을 도울 수 있습니다 : http://stackoverflow.com/questions/22411482/c-template-functions-overload-resolution. @NikosAthanasiou의 답변보기. – chema989

+1

가능한 복제본 : http://stackoverflow.com/questions/31563580/c-templated-function-overloading-rules?lq=1 – sameerkn

답변

0

파생 된 개체를 함수에 전달 중입니다.

이 경우 두 번째 함수 템플릿의 인수에 대해 하나의 암시 적 변환 (Derived<T>에서 Base<T>까지)이 있어야합니다. 첫 번째 함수 템플릿의 경우 정확히 일치하고 선호됩니다.

어떻게 다른 기능을 사용할 수 있습니까?

암시 적 변환을 피하기 위해 두 번째 함수 템플리트의 매개 변수 유형을 변경할 수 있습니다. std::enable_ifstd::is_base_of과 함께 사용하면 기본 클래스 및 파생 클래스에서만 작동합니다.


Live Demo

template <typename T, template <typename> class D> 
typename std::enable_if<std::is_base_of<Base<T>, D<T>>::value>::type 
func(const D<T>& x){ 
    x.print(); 
    cout<<"in func(Base<T>)"<<endl; 
} 

은 BTW : 나는 Base::print() 가상 기능이 있어야한다고 생각합니다.

0

간단한 대답은 다음과 같습니다

  • template instantiation 컴파일 타임에서 수행됩니다 : 컴파일 시간에 따라서 void func(T x)는 그런 종류의 정의를 인스턴스화하는 데 사용됩니다 Derived<int>를 취할 수있는 기능이 없다 기능.

implicit dynamic conversion은 런타임에 완료됩니다.