2010-06-18 6 views
3

클래스 C에 대해 템플릿 메서드를 특수화하고 싶습니다.이 메서드는 int 매개 변수로 템플릿화 된 입니다.템플릿 특수화에 대한 C++ 컴파일러 오류

어떻게하면됩니까?

template <int D=1> 
class C { 
    static std::string foo() { stringstream ss; ss << D << endl; return ss.str();}  
}; 

template <class X> 
void test() { cout << "This is a test" << endl;} 

template <> 
template <int D> 
void test<C<D> >() {cout << C<D>::foo() << endl;} 

"test()의 선언문에 너무 많은 템플릿 매개 변수 목록이 있습니다"라는 test() 전문화가 실패합니다.

답변

2

을 함수 템플릿 부분 특수화는 허용되지 않습니다. 해야합니까

template <int D> 
void test() {cout << C<D>::foo() << endl;} 
1

부분적으로 test<C<D>>의 첫 번째 template<>을 원하지 않습니다. 또한 클래스 템플리트를 부분적으로 만 특수화 할 수 있고 함수 템플리트는 지정할 수 없습니다. 이런 식으로 뭔가를 작동 할 수 있습니다 : 함수 템플릿 인수를 가지고 가고, 템플릿 인수를 추론하는 것을 사용

template <class X> 
struct thing 
{ 
    static void test() { cout << "This is a test" << endl;} 
}; 

template <int D> 
struct thing<C<D>> 
{ 
    static void test() {cout << C<D>::foo() << endl;} 
}; 

경우

는, 당신은 오버로드를 사용하여 비슷한 효과를 얻을 수있는, 같은 :

template <class X> 
void test(const X&) { cout << "This is a test" << endl;} 

template <int D> 
void test(const C<D>&) {cout << C<D>::foo() << endl;} 

test(3); // calls first version 
test(C<3>()); // calls second version 
+0

그건 작동하지 않습니다. 이제 메시지가 나타납니다. 부분 전문화 'test >'이 허용되지 않습니다. – user231536

+0

아, 그 사실을 잊어 버렸습니다. 클래스 템플릿을 부분적으로 만 특수화 할 수 있습니다. –