2010-07-18 202 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