다른 곳에서이 질문에 대한 답을 찾을 수 없어서 결국 물어보기로했습니다.템플릿 인수에 캐스팅 연산자의 특수화
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"키워드로 템플릿 대괄호로 놀아보고 다른 필사적 인 시도도했습니다. 그들 모두가 이상한 오류를 낳습니다. 나는 여기에 붙여 넣기를하지 않을 것입니다.
몇 가지 확실한 세부 정보가 손실 되었습니까? 나에게 어떤 힌트/포인터가 있습니까? 어떤 도움이 유용 할 것입니다.
흠 ... 빠른 응답을 주셔서 감사합니다,하지만 난 정말 답을 undersand하지 않습니다. "부분 특정화"란 정확히 무엇을 의미합니까? 내가 아는 한, 내 전문화는 가득 차있다 : 템플릿 <> // <- 인수가없고 전문화가 없다 bar :: operator type2() {...} (유형을 type1로 변경했습니다. type2는 실제 타입으로 사용됩니다. type1 = type2 = int라고 가정 해 봅시다. 반면에 상속을 포함하지 않는 솔루션이 있습니까? 고맙습니다. –
dunadar
@dunadar : 클래스의 템플릿 매개 변수에서 멤버 함수를 특수화 할 수 없습니다. 상속을 사용하거나 SFINAE에 교활해야합니다 (나는 그렇지 않습니다. 또한 SFINAE 변환 연산자를 쉽게 사용할 수 있는지 확신 할 수 없습니다.) 생각해 볼 것입니다. –
@dunadar : 나는 나에게 떠올랐다. 함수가 _template_ 함수로 만들어지면 모든 것이 훌륭하고 멋 스럽습니다. 답변이 업데이트되었습니다. –