我有一个带有int和模板模板参数的模板类。 现在我想专门化一个成员函数:
template <int I> class Default{};
template <int N = 0, template<int> class T = Default> struct Class
{
void member();
};
// member definition
template <int N, template<int> class T> inline void Class<N, T>::member() {}
// partial specialisation, yields compiler error
template <template<int> class T> inline void Class<1, T>::member() {}
有人可以告诉我这是否可能以及我在最后一行做错了什么?
编辑:我要感谢大家的意见。由于我还需要对某些T进行专门化,因此我选择了Nawaz建议的解决方法,专门针对整个类,因为它只有一个成员函数和一个数据成员。答案 0 :(得分:6)
你不能部分专门化一个成员函数,你必须为整个类做。
template <int I> class Default{};
template <int N = 0, template<int> class T = Default> struct Class
{
void member();
};
// member definition
template <int N, template<int> class T> inline void Class<N, T>::member() {}
// partial specialization
template <template<int> class T> struct Class<1, T>
{
void member() {}
};
答案 1 :(得分:3)
由于这是不允许的,这里有一个解决方法:
template <int I> class Default{};
template <int N = 0, template<int> class T = Default>
struct Class
{
void member()
{
worker(int2type<N>()); //forward the call
}
private:
template<int N> struct int2type {};
template<int M>
void worker(const int2type<M>&) //function template
{
//general for all N, where N != 1
}
void worker(const int2type<1>&) //overload
{
//specialization for N == 1
}
};
这个想法是,当N = 1时,函数调用worker(int2type<N>())
将解析为第二个函数(特化),因为我们传递的是int2type<1>
类型的实例。否则,将解决第一个,一般的功能。
答案 2 :(得分:2)
在C ++中,不允许对函数进行部分特化;你只能部分地专门化类和结构。我相信这也适用于会员职能。
答案 3 :(得分:2)
查看此文章:http://www.gotw.ca/publications/mill17.htm
它非常小,并且有很好的代码示例。它将解释patial模板函数专业化的问题,并展示其他方法。