2012-02-17 5 views
2

C++에서는 자체 템플릿 인 객체에 대해 템플릿 함수를 특수화하려고합니다. test.h : 여기 템플릿 기반 클래스에 대한 템플릿 함수의 특수화

는 기본 예입니다

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
void f(U y) { 
} 

template <> 
template <class T> 
void f<myC<T> >(myC<T> y) { 
} 

Test.cpp에

#include "test.h" 
int main() { 
    myC<double> m; 
    f(m); 
} 

GCC 4.6.1 나에게 다음과 같은 오류 메시지가 있습니다 :

In file included from test.cpp:1:0: 
test.h:13:25: error: too many template parameter lists in declaration of ‘void f(myC<T>)’ 
test.h:13:6: error: template-id ‘f<myC<T> >’ for ‘void f(myC<T>)’ does not match any template declaration 
test.h:13:25: note: saw 2 ‘template<>’, need 1 for specializing a member function template 

을 가능한가요? 아니면 같은 목표를 달성하기위한 또 다른 방법이 있습니까?

답변

2

당신은 템플릿 기능을 전문으로 수 없습니다; 템플릿 클래스 만 특수화 할 수 있습니다. 편집 : Nawaz의 대답은 정확합니다. 템플릿 기능에는 클래스 전용 부분 규정이 허용되지 않습니다. 전체 전문성이 가능합니다 :

이 문맥에서 추론 할 수있는 경우 템플릿 인수를 명시 적으로 지정 될 필요하는 것으로
template <class U> void f(U y) {} 
template<> void f<double>(double y) {} // specialization for double 

: 귀하의 경우

template<> void f<>(int y) {} // specialization for int 

이 전체 전문화가 가능하지 않은 때문에 함수 인수는 템플릿 클래스입니다.그러나 템플릿 함수는 모든 함수와 마찬가지로 오버로드 될 수 있습니다. 귀하의 경우, 그것은 다음과 같습니다 :

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
void f(U y) { 
} 

template <class T> 
void f(myC<T> y) { 
} 

int main() { 
    myC<double> m; 
    f(m); 
    return 0; 
} 
0

내가 알 수있는 한, 템플릿 클래스 (또는 구조체) 만 템플릿 함수를 특수화 할 수 없습니다. 단지 공용 정적 멤버 함수와 구조체를 선언하고 구조체에 템플릿 매개 변수를 MAVE :

template <class T> 
class myC { 
    T x; 
}; 

template <class U> 
struct Foo 
{ 
    static void f(U y) { 
    } 
}; 

template <> 
template <class T> 
struct Foo<myC<T> > 
{ 
    static void f(myC<T> y) { 
    } 
}; 

의 단점은 그 클래스 템플릿이 자동으로 템플릿 매개 변수가 해결되지 않을 것입니다

는하지만 거의 제한이 없다. 하지만 그 easlily 원래 하나에, 함수 템플릿과 유사한 해결할 수 있습니다 기능의 경우에는 허용되지 않습니다

template <class U> 
void f(U y) { 
    return Foo<U>::f(y); 
} 
부분 전문화라고 당신이 여기 일을 할 atttempting하고
4
template <> 
template <class T> 
void f<myC<T> >(myC<T> y) { 
} 

주형.

함수 템플릿은 완전히이거나 전문화되지 않았습니다. 언어 스펙에서는 함수 템플리트의 부분 특수화를 허용하지 않습니다.

그래서 할 수 있습니다 과부하 함수 템플릿으로 : 허용하고, 템플릿도 완전히 전문화 선호한다

template <class T> 
void f(myC<T> y) //note that it is overload, not specialization 
{ 
} 

.

하는 허브 셔터에 의해이 기사를 읽기 :

+0

C++ 11에서 소개되지 않았습니까? –

관련 문제