2012-04-16 120 views
6

可能重复的模板成员:
Specialization of templated member function in templated class专业模板类

template <class T>  
class MyClass 
{ 
    template <int N> 
    void func() {printf("unspecialized\n");} 
}; 
template<class T> 
template<> 
MyClass<T>::func<0>() 
{ 
    printf("specialzied\n"); 
} 

这是行不通的。是否可以专门化模板类的模板方法?

+1

你应该添加你得到的错误信息,因为“不起作用”真的没有告诉我们很多。 – sth 2012-04-16 17:23:36

回答

13

它不能按要求完成。出于某种原因(我不知道的理由)明确(即)时封闭类也明确成员模板的专业化只允许(即完全)专业。这个要求在语言标准中明确阐述(参见C++ 98中的14.7.3/18,C++ 11中的C++ 03和14.7.3/16)。

与此同时,构件类的局部模板是允许的,在许多情况下可以被用作一种解决方法(虽然难看)。但是,很明显,它只适用于模板。当涉及到成员函数模板时,必须使用替代解决方案。

例如,一个可能的解决方法是将调用委托给一个模板类的静态成员,专门的类,而不是(这常被推荐为比函数模板http://www.gotw.ca/publications/mill17.htm专业化更好的主意)

template <class T>  
class MyClass 
{ 
    template <int N, typename DUMMY = void> struct Func { 
    static void func() { printf("unspecialized\n"); } 
    }; 

    template <typename DUMMY> struct Func<0, DUMMY> { 
    static void func() { printf("specialized\n"); } 
    }; 

    template <int N> void func() { Func<N>::func(); } 
}; 
+0

谢谢,这就是我发现的 - 我必须专注于包含类。您使用该类功能的解决方案可能是我的最佳解决方案 – 2012-04-16 17:46:04

+0

您是否有此要求的参考?我一直在阅读标准中看起来相关的部分(从第14.7.3节开始),并且一直未能找到这个要求。 – 2012-04-16 17:50:43

+2

@Jerry:C++ 11§14.7.3/ 16:“* ...除非声明不明确地专门化类成员模板,如果它的封闭类模板也没有明确专用的话。”* – ildjarn 2012-04-16 18:00:54