2011-12-01 3 views
2

다른 곳에서이 질문에 대한 답을 찾을 수 없어서 결국 물어보기로했습니다.템플릿 인수에 캐스팅 연산자의 특수화

template <class E, class B> 
class bar { 
    private: 
     B innerVal_; 
    [...] 
    public: 
     /* Casting to the type of the 2nd template argument */ 
     operator B() const { return innerVal_; }; // default implementation provided 
}; 
그러나

, 내가 예를 들어, 일부 특정 템플릿 인수에 대해이 캐스팅 연산자의 전문화를 제공해야합니다 : 나는 인수 중 하나의 유형에 캐스팅 연산자를 포함하는 C++ 템플릿 클래스가

template<> 
bar<concreteType,int>::operator int() // <-- whoops, error! 
{ [...] } 

캐스팅 연산자의 구문을 지정하는 방법에 관계없이 gcc는 일관되게 함수 선언에 대한 오류를 반환합니다. 가장 일반적인 일이다 : 나는이 라인을 가지고

error: template-id ‘operator int<>’ for ‘bar< concreteType, int>::operator int()’ does not match any template declaration.

:

  • 는 "운영자 b를 입력()"를 사용하여 "운영자 INT()"로 캐스팅 연산자를 정의, 선언 후 원본 템플릿에서 "typedef B typeB;"

"typename"키워드로 템플릿 대괄호로 놀아보고 다른 필사적 인 시도도했습니다. 그들 모두가 이상한 오류를 낳습니다. 나는 여기에 붙여 넣기를하지 않을 것입니다.

몇 가지 확실한 세부 정보가 손실 되었습니까? 나에게 어떤 힌트/포인터가 있습니까? 어떤 도움이 유용 할 것입니다.

답변

3

C++에서는 클래스의 템플릿 매개 변수에 멤버 함수를 특화시킬 수 없습니다. 그래서 여기에 해결 방법입니다 : 훨씬 간단

template <class E, class B> 
class bar_base { //base class with 99% of the implementation 
    private: 
     B innerVal_; 
    public: 
    [...] //most of your members here 
}; 
template <class E, class B> 
class bar : public bar_base<E,B> { //normal instantiation 
public: 
    [...] //constructors only 
    /* Casting to the type of the 2nd template argument */ 
    operator B() const { return innerVal_; }; // default implementation provided 
}; 
template <class E> 
class bar<E,int> : public bar_base<E,int> { //E,int specialization 
public: 
    [...] //constructors only 
    operator int() const { [...]}; 
}; 

또는, 지금은 그것을 생각 :

private: 
    template<class T> 
    T convert_to() {return innerVal_; } 
    template<> 
    int convert_to<int>() {return innerVal_; } 
public: 
    operator B() const { return convert_to<B>(); }; 
+0

흠 ... 빠른 응답을 주셔서 감사합니다,하지만 난 정말 답을 undersand하지 않습니다. "부분 특정화"란 정확히 무엇을 의미합니까? 내가 아는 한, 내 전문화는 가득 차있다 : 템플릿 <> // <- 인수가없고 전문화가 없다 bar :: operator type2() {...} (유형을 type1로 변경했습니다. type2는 실제 타입으로 사용됩니다. type1 = type2 = int라고 가정 해 봅시다. 반면에 상속을 포함하지 않는 솔루션이 있습니까? 고맙습니다. – dunadar

+0

@dunadar : 클래스의 템플릿 매개 변수에서 멤버 함수를 특수화 할 수 없습니다. 상속을 사용하거나 SFINAE에 교활해야합니다 (나는 그렇지 않습니다. 또한 SFINAE 변환 연산자를 쉽게 사용할 수 있는지 확신 할 수 없습니다.) 생각해 볼 것입니다. –

+0

@dunadar : 나는 나에게 떠올랐다. 함수가 _template_ 함수로 만들어지면 모든 것이 훌륭하고 멋 스럽습니다. 답변이 업데이트되었습니다. –

관련 문제