2009-06-25 7 views
2

danke für suchen habe ich dieses Beispiel aus meinem Buch, aber ich kann verstehen, warum die LinieHilfe mit expliziter Vorlage especialization

S<void,int> sv; // uses Template at (2) 

aber

S<void,char> e2; 
//uses (1) when im thinking it would use (2) especialization as well 

könnte jemand das Verhalten erklären? BTW alle Kommentare in Code unten sind von Buchautor

vielen Dank!

template<typename T> 
class Types { 
    public: 
    typedef int I; 
}; 

template<typename T, typename U = typename Types<T>::I> 
class S;      // (1) 

template<> 
class S<void> {     // (2) 
    public: 
    void f(); 
}; 

template<> class S<char, char> {}; // (3) 

template<> class S<char, 0>; // ERROR: 0 cannot substitute U 

int main() 
{ 
    S<int>*  pi; // OK: uses (1), no definition needed 
    S<int>  e1; // ERROR: uses (1), but no definition available 
    S<void>*  pv; // OK: uses (2) 
    S<void,int> sv; // OK: uses (2), definition available 
    S<void,char> e2; // OK: uses (1), definition available 
    S<char,char> e3; // ERROR: uses (3), but no definition available 
} 

Antwort

3

Warum es (2) verwenden sollte?

(2) ist eine Spezialisierung von S<void, int>. Was Sie haben, ist S<void, char>. Die Typen sind unterschiedlich, daher wird die Spezialisierung nicht verwendet. Spezialisierungen gelten nur, wenn sie genau entsprechen. Es ist nicht gut genug, dass "ein char implizit zu einem int befördert werden kann". Wenn für S<void, char> keine Spezialisierung existiert, wird die allgemeine, nicht spezialisierte Version verwendet.

+0

aber es ist nicht die Spezialisierung für S entweder i siehe especialization Nur für S und {} und S sv; verwendet S pyralis

+1

o i jetzt gerade gesehen, dass implizit eine S Ursache für das in Allgemeiner Vorlage Standardargument ist sorry ich im einen noobie verpaßt vielen Dank! Ich sehe es jetzt klar – pyralis

Verwandte Themen