我正在使用 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' : a partial specialization cannot have a dependent non-type template parameter
也许我的问题没有解决方案。但这也是一个答案。
提前感谢您的帮助。
最佳答案
如果我确实正确理解了您要实现的目标,它无法完成。让我们考虑一个更更简单的非法特化案例:
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/