2013-01-16 63 views
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: '专业化':将部分专业化不能有一个独立的非模板参数

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

感谢您的帮助提前。

+0

这可能是您将使用委托的那些实例之一。 http://msdn.microsoft.com/en-us/library/213x8e7w%28v=vs.90%29.aspx – Tebc

+3

为什么你需要专业化?主模板具有默认参数,这意味着您可以忽略它。你想要达到什么目的? –

+0

如果成员函数指针为空,我必须实现一个完整的不同列表类。并且希望将这两个实现分开以使其具有干净的代码(no if ... else)。 – zussel

回答

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 

末端示例]

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

您最初的设计就是这种专业化,其中最后一个(非类型)参数有一个默认的参数值,你在专业化忽略的特定情况下(忽略它是合法的本身)。这是非法的原因是不是与默认参数的存在相关,而是与您正尝试专门化具有依赖类型的非类型参数有关。

+0

感谢您的解释!这对我来说很有意义。现在我必须为我的问题寻找另一种解决方案。 – zussel