2 Stimmen

VS2010 C++ Mitglied Vorlage Funktion Spezialisierung Fehler

Ich habe den folgenden (minimierten) Code, der in VC2005 funktionierte, aber in 2010 nicht mehr funktioniert.

template <typename TDataType>
class TSpecWrapper
  { 
  public:
    typedef typename TDataType::parent_type index_type;

  public:

    template <bool THasTriangles>
    void Spec(index_type& io_index)
      { std::cout << "False version" << std::endl; }

    template <>
    void Spec<true>(index_type& io_index)
      { std::cout << "True version" << std::endl; }
  };

Es scheint, dass, wenn "index_type" ein abhängiger Typ ist, ich immer eine C2770: ungültige explizite Vorlage Argument (s) Fehler auf die Spezialisierung erhalten. Beachten Sie, dass dieser Code tatsächlich genug ist, um den Fehler zu erzeugen - eine leere main ist ausreichend, um es zu kompilieren, die Vorlage muss nicht einmal instanziiert werden.

Es funktioniert gut, wenn index_type kein abhängiger Typ ist. Irgendwelche Ideen, warum dies so in VC2010 ist, wenn dies tatsächlich Standardverhalten oder ein Fehler ist, und wenn ich es umgehen kann?

7voto

Alexey Malistov Punkte 25541

Abhilfe

template <bool v> struct Bool2Type { static const bool value = v; }; 

template <typename TDataType> 
class TSpecWrapper 
{  
public: 
    typedef typename TDataType::parent_type index_type; 

public: 
    template <bool THasTriangles> 
    void Spec(index_type& io_index) 
    { 
        return SpecHelp(io_index, Bool2Type<THasTriangles>());
    } 

private:
    void SpecHelp(index_type& io_index, Bool2Type<false>) 
    { std::cout << "False version" << std::endl; } 

    void SpecHelp(index_type& io_index, Bool2Type<true>) 
    { std::cout << "True version" << std::endl; } 

};

4voto

Kirill V. Lyadvinsky Punkte 92957

Dies entspricht dem C++ Standard 14.7.3/18:

In einer expliziten Spezialisierungsdeklaration für einen Member einer Klassenvorlage oder einer Membervorlage, die erscheint im Namespace-Bereich auftaucht, können die Membervorlage und einige der sie einschließenden Klassenvorlagen eine Rema mit der Ausnahme, dass die Deklaration eine Klassenschablone nicht explizit spezialisieren darf, wenn die sie einschließende Klasse Vorlagen nicht ebenfalls explizit spezialisiert sind . <...>

Es ist nicht erlaubt, sich zu spezialisieren Spec ohne Spezialisierung TDataType .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X