我正在使用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> { };

错误消息是:



也许我的问题没有解决办法。但这也是一个答案。

感谢您的帮助。

最佳答案

如果我确实理解您要实现的目标,请做到。让我们考虑一个更简单的非法特化案例:

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

—结束示例]”

您不能专用于其类型取决于模板参数列表中其他类型的非类型参数。因此,上述特化是非法的。

您的原始设计只是该特化的一个特殊情况,其中最后一个(非类型)参数具有默认参数值,您在特化中将其省略(忽略它本身是合法的)。之所以不合法,是因为并非与默认参数的存在有关,而是与您试图专门化非类型参数的事实有关,即具有从属类型

关于c++ - 使用成员函数指针专门化模板类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14359550/

10-09 13:31