2010-07-18 126 views
10

考虑以下类:相依非类型模板参数

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和科莫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

我想说错误消息是假的。 FWIW,即使'Foo'是模板,Comeau也接受代码。我建议你尝试在MS的新闻组之一。 MS编译器人员曾经在那里闲逛。 – sbi 2010-07-18 18:20:48

回答

4

我怎样才能解决这个问题(即,保持在一个模板美孚内部伪明确的专门化)在VC++ 2010?

您可以枚举类型非依赖在一个非模板基类声明它(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会莫名其妙地依赖,这不会使其形成不良的,只要它不会在你的“错误类”的例子依赖于专业化的参数一样链接。

+3

非常恼火的是,微软无法在考虑到他们所有的人力资源的情况下生成符合要求的编译器。特别是当您考虑非免费版本的要价时。 – rybz 2010-07-18 21:14:35

+0

@litb:我不确定我遵循:“Flags”如何依赖于专业化的参数? – HighCommander4 2012-04-28 19:48:43