依赖的非类型模板参数

时间:2010-07-18 17:53:51

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

考虑以下课程:

class Foo
{
  enum Flags {Bar, Baz, Bax};

  template<Flags, class = void> struct Internal;

  template<class unused> struct Internal<Bar, unused> {/* ... */};
  template<class unused> struct Internal<Baz, unused> {/* ... */};
  template<class unused> struct Internal<Bax, unused> {/* ... */};
};

在VC ++ 2010和Comeau C ++上测试时,上面的类概述按预期编译和运行。但是,当Foo成为模板本身时,上述代码段在VC ++ 2010下会中断。

例如,以下代码段:

template<class> class Foo
{
  // Same contents as the original non-templated Foo.
};

产生以下error class

C2754: 'Foo<<unnamed-symbol>>::Internal<Bar,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Baz,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Bax,unused>' : a partial specialization cannot have a dependent non-type template parameter

  1. 有人可以用简单的英语解释这里发生了什么吗?
  2. 如何在VC ++ 2010上修复此问题(即在模板Foo中保留内部伪显式特化)?

1 个答案:

答案 0 :(得分:4)

  

如何在VC ++ 2010上修复此问题(即在模板化的Foo中保留内部伪显式特化)?

您可以通过在非模板基类中声明枚举类型来使其不依赖(C ++ 03使嵌套类依赖于#108但不包括枚举,但即使如此代码仍然合法)。

struct FooBase { 
  enum Flags {Bar, Baz, Bax};
};

template<class> class Foo : public FooBase {
  template< ::FooBase::Flags, class = void > struct Internal;
  // same other stuff ...
};

“错误类”链接已经提供了应该提高错误的预期情况的描述。该错误认为所有依赖类型都是被禁止的,但实际上这就是标准所说的:

  

与专用非类型参数对应的模板参数的类型不应取决于特化的参数。

因此,即使名称Flags以某种方式依赖,只要它不依赖于特殊化的参数(例如“错误类”的示例),也不会使其形成错误“链接。