我正在使用VS 2008(抱歉,无法更新)。我的列表类需要模板专业化。我想要专门化的参数是一个成员函数指针。
简而言之,我如何使以下代码工作(我可以'使用可变参数模板):
// two or three args
template <typename T1, typename T2, void (T1::* FUNC)(const T2&) = 0> struct list;
// specialized code for 2 args.
template <typename T1, typename T2> struct list<T1, T2> { };
错误消息是:
C2754:'specialization':部分特化不能有依赖的非类型模板参数
也许我的问题没有解决办法。但这也是一个答案。
提前感谢您的帮助。
答案 0 :(得分:2)
如果我确实理解了您要实现的目标,无法完成。让我们考虑一个甚至更简单的非法专业化的案例:
template <typename T1, typename T2, void (T1::* FUNC)(const T2&)> struct list;
template <typename T1, typename T2> struct list<T1, T2, 0> { };
在这里,你总是必须提供三个参数来实例化你的模板,并且你试图在最后一个参数是空指针的情况下专门化主模板。
C ++标准的§14.5.5/ 8 :
“与专门的非类型参数对应的模板参数的类型不应该依赖于特化的参数。[例如:
template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error
template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error
-end example] “
您不能专门化类型依赖于模板参数列表中其他类型的非类型参数。因此,上述专业化是非法的。
您的原始设计只是此专业化的特殊情况,其中最后一个(非类型)参数具有默认参数值,您在专门化中省略(省略它是合法的本身)。这是非法的原因是不与默认参数的存在相关,而是因为您正在尝试专门化非类型参数具有依赖类型。