2013-02-11 5 views
1

템플릿 클래스를 전문화하여 Base 유형의 포인터와 다른 모든 포인터 유형에 대해 다르게 동작하게하고 싶습니다. 나는 그것을 사용하여 그것을 시도했다. 하지만 원하는 방식대로 작동하지 않습니다. 아무도 그것에 대해 무엇을해야하는지 말해 줄 수는 없어요. 내가 시도 코드 : 기존 과부하 집합의 부분 집합에 enable_if를 추가 할 때포인터에 대한 템플릿 특수화

class Base 
{ 
}; 

class Derived:public Base 
{ 
}; 

class Non_base 
{ 
}; 

template<class T,class Enable=void> class Vector 
{ 
public: 
    Vector() 
    { 
     cout<<"Constructor of Vector "<<endl; 
    } 
}; 



template<class T> class Vector<T*> 
{ 
public: 
    Vector() 
    { 
     cout<<"Constructor of Vector<T *> "<<endl; 
    } 
}; 



template<> class Vector<Base*> 
{ 
public: 
    Vector() 
    { 
     cout<<"Constructor of Vector<Base*> fully specialized"<<endl; 
    } 
}; 


//template<class T> class Vector<T *>:public Vector<Base *> 
//{ 
//public: 
// Vector() 
// { 
//  cout<<"Constructor of Vector<Base*> partially specilized"<<endl; 
// } 
//}; 


template<class T> class Vector<T*,typename enable_if<is_base_of<Base,T>::value>::type> 
{ 
    Vector() 
    { 
     cout<<"Constructor of Vector<Base*> partially specilized"<<endl; 
    } 
}; 

답변

3

, 일반적으로뿐만 아니라 나머지 멤버에 추가해야합니다. 일부 과부하가 활성화되면 나머지는 비활성화되어야합니다. 그렇지 않으면 모호한 점이 있습니다.

template<class T> class Vector<T*,typename enable_if<!is_base_of<Base,T>::value>::type> 
{ 
public: 
    Vector() 
    { 
     cout<<"Constructor of Vector<T *> "<<endl; 
    } 
}; 

당신은 이미 모호하지 않을 수 있도록 세트의 최고의 경기의로 전체 전문화에 enable_if<!…>를 추가 할 필요가 없습니다.

+0

템플릿 함수에 대해 동일한 작업을 수행하려고하면 오류가 발생합니다. 올바른 것으로 보이는 템플릿 클래스를 다시 선언하십시오. 나는 포인터를 가지고 함수를 선언했다. 하나는 Base 타입이고 다른 타입은 기본 타입이 아닌지 검사했다. 그러나 두 기능 모두 동일한 논점을 가지고 있습니다. 어떻게 피할 수 있습니까? – sajas

+0

흠, 당신이 묘사하는 것이 확실하지 않습니다. 다른 질문을 열 수도 있습니다. – Potatoswatter