2016-07-25 5 views
1

Dieser Beispielcode generiert expected a class template, got std::pair <_T1, _T2>. Ich versuchte mit struct Struct <std::pair> {};, aber dann werden die Parameter T und M nicht mehr zu entfernen. Wie vermeide ich das?Vorlage Vorlage teilweise Spezialisierung Fehler: "erwartet eine Klassenvorlage"

template <template <class...> class> 
    struct Struct {}; 

    template <class T, class M> 
    struct Struct <std::pair <T, M>> {}; 
+1

'std :: pair' ist Klassenvorlage,' std :: pair <_T1, _T2> 'ist es nicht. Sie könnten die primäre Template-Deklaration in 'template struct Struct {};' ändern. – songyuanyao

Antwort

2

Abhängig von dem, was Sie wollen

template <template <class...> class> 
struct Struct {}; 

template <> 
struct Struct <std::pair> 
{ 
    // Specialization 
}; 

oder

template <typename> struct Struct {}; 

template <typename First, typename Second> 
struct Struct <std::pair<First, Second>> 
{ 
    // Specialization 
}; 
1

Dies ist keine gültige Spezialisierung für Ihre Vorlage.

Der Grund warum ist, weil std::pair<T, M> eine vollständige Spezialisierung der Klassenvorlage std::pair und daher eine Klasse ist. Ihre Vorlage erwartet einen Klassenvorlagenparameter, der genau das ist, was der Compiler Ihnen sagt.