【问题标题】:Specialize a template class with a member function pointer使用成员函数指针专门化模板类
【发布时间】:2013-01-16 13:26:57
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

  • 这可能是您将使用委托的实例之一。 msdn.microsoft.com/en-us/library/213x8e7w%28v=vs.90%29.aspx
  • 为什么需要这种专业化?主模板有一个默认参数,这意味着您可以省略它。你想达到什么目标?
  • 如果成员函数指针为空,我必须实现一个完全不同的列表类。并希望将这两个实现分开以获得干净的代码(没有 if ... else)。
  • @Tebc 我不想将它与 c# 混合使用,因为代码也需要在 linux 下运行并且应该是原生 c++。对不起。

标签: c++ templates visual-c++


【解决方案1】:

如果我确实正确理解了您想要达到的目标,无法完成。让我们考虑一个更更简单的非法专业化

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

——结束示例]"

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

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

【讨论】:

  • 感谢您的解释!这对我来说很有意义。现在我必须为我的问题寻找另一种解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多