1

我正在使用 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:“专业化”:部分专业化不能具有依赖的非类型模板参数

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

提前感谢您的帮助。

4

1 回答 1

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

——结束示例]

您不能专门化其类型依赖于模板形参列表中的其他类型的非类型实参。因此,上述专业化是非法的。

您的原始设计只是此专业化的一个特例,其中最后一个(非类型)参数具有默认参数值,您在专业化中将其省略(省略它本身是合法的)。这是非法的原因与默认参数的存在无关,而是与您试图专门化具有依赖类型的非类型参数的事实有关。

于 2013-01-16T13:57:57.020 回答