C++ 用成员函数指针专门化模板类

C++ 用成员函数指针专门化模板类,c++,templates,visual-c++,C++,Templates,Visual C++,我正在使用VS2008(抱歉,无法更新)。我需要为我的列表类专门化模板。我要专门化的参数是成员函数指针 简言之,我如何使以下代码工作(我可以使用可变模板): //两个或三个参数 模板结构列表; //2个参数的专用代码。 模板结构列表{}; 错误消息是: C2754:“专门化”:部分专门化不能有依赖的非类型模板参数 也许我的问题没有解决办法。但这也是一个答案 提前感谢您的帮助。如果我确实正确理解您想要实现的目标,这是不可能的。让我们考虑一个更简单的例子:非法< /强>专业化: 模板结构列表; 模

我正在使用VS2008(抱歉,无法更新)。我需要为我的列表类专门化模板。我要专门化的参数是成员函数指针

简言之,我如何使以下代码工作(我可以使用可变模板):

//两个或三个参数
模板结构列表;
//2个参数的专用代码。
模板结构列表{};
错误消息是:

C2754:“专门化”:部分专门化不能有依赖的非类型模板参数

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


提前感谢您的帮助。

如果我确实正确理解您想要实现的目标,这是不可能的。让我们考虑一个更简单的例子:<强>非法< /强>专业化:

模板结构列表;
模板结构列表{};
在这里,您必须始终提供三个参数来实例化模板,并且在最后一个参数为空指针的情况下,尝试专门化主模板

(< >强>>{5.5.5/8</强>C++标准:

“与专用非类型参数对应的模板参数的类型不应依赖于专用的参数。[示例:

模板结构C{};
模板结构C;//错误
模板A类{};
int数组[5];
模板类A{};//错误
-结束示例]”

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


您的原始设计只是这种专门化的一种特殊情况,其中最后一个(非类型)参数有一个默认参数值,您可以在专门化中忽略它(忽略它本身是合法的)。这是非法的原因是与默认参数的存在无关,而是与您试图专门化具有从属类型的非类型的参数这可能是使用委托的实例之一。你为什么需要专业化?主模板有一个默认参数,这意味着您可以忽略它。您希望实现什么?如果成员函数指针为null,我必须实现一个完全不同的列表类。并且想把这两个实现分开来实现干净代码(如果……不)…@ TeBC我不想把它与C语言混合,因为代码也需要在Linux下运行,应该是本地C++。对不起,谢谢你的解释!这对我来说是有道理的。现在我必须为我的问题寻找另一种解决办法。
// 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> { };
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