2014-04-13 4 views
5

verwendet Ich habe "const ObjArray&" als Argument für die ObjArray-Vorlage verwendet, ohne darüber nachzudenken. Es scheint gut zu funktionieren, aber es sah aus, als ich es wieder las. Sollte es nicht "const ObjArray<T> &" sein? Ist es in Ordnung, auf den Vorlagennamen ohne den Parameter zu verweisen? Funktioniert es unten nur, weil es inline erklärt wird, dass Compiler T annimmt?C++ - Vorlagenname ohne Template-Parameter

template <class T> 
class ObjArray : public BArray 
{ 
public: 
    inline ObjArray() : 
     BArray(sizeof(T), NULL) 
    { 
    } 

    inline ObjArray(const ObjArray& src) : 
     BArray(sizeof(T), NULL) 
    { 
     copyFrom((ObjArray&)src); 
    } 

    inline ObjArray(ObjArray& src) : 
     BArray(sizeof(T), NULL) 
    { 
     copyFrom(src); 
    } 
    ... 
}; 
+9

Es ist OK innerhalb der Klassendefinition. – juanchopanza

+1

Ein Klassenname ist innerhalb seiner eigenen Definition sichtbar. Dies wird "Klassennamen-Injektion" genannt. Bei Klassenvorlagen wird der Vorlagenname, wenn keine Vorlagenargumente folgen, als Name der eingefügten Klasse betrachtet. Also ja, es ist in Ordnung, nur "ObjArray" innerhalb der Definition von "ObjArray" zu verwenden. –

Antwort

4

Nein, ist, dass die Nutzung richtig: Innerhalb einer Klassenvorlage, bezieht sich der Name der Klasse dieser Instanz der Vorlage, so dass die Template-Parameter ist nicht neccesary: ​​

template<typename T> 
struct foo 
{ 
    foo(const foo&); //Copy ctor. foo is the same as foo<T> 
}; 

Dieses Verhalten definiert ist gut in dem Punkt 14.6.1 erklärt Lokal Namen des Standard (Hervorhebung von mir):

14.6.1 Lokal deklarierte Namen [temp.local]
Wie normale (Nicht-Template-) Klassen haben Klassenvorlagen den Namen einer eingefügten Klasse (Abschnitt 9). Der injected-class-name kann mit oder ohne template-argument-list verwendet werden. Wenn es ohne eine Template-Argumentliste verwendet wird, entspricht es dem Klassennamen , gefolgt von den Template-Parametern der Klassenvorlage, eingeschlossen in <>. Wenn es mit einer Vorlagen-Argumentliste verwendet wird, bezieht es sich auf die spezifizierte Klassenvorlagenspezialisierung , die die aktuelle Spezialisierung oder eine andere Spezialisierung sein könnte.

Beachten Sie, dass die Syntax nur ein Alias ​​der aktuellen Vorlageninstanz ist. Wenn Sie dieselbe Vorlage mit anderen Parametern benötigen, müssen Sie sie explizit mit der klassischen Syntax angeben. Zum Beispiel:

template<typename U> 
operator foo<U>() const //Implicit conversion to other instance of the template 
{ 
    return ...; 
} 
1

Ja, es ist korrekt C++ Syntax. In Bezug auf Ihre Frage über sie inline zu sein, können Sie es wie diese außerhalb der Klassendeklaration schreiben konnte:

template<typename T> 
foo<T>::foo(const foo&) 
{} 

Und es wäre immer noch richtig sein. Beachten Sie, dass nur der erste foo den Template-Parameter explizit trägt. Sobald es spezifiziert wurde, ist der Kontext vollständig definiert, und jetzt können Sie foo als einen vollkommen legalen Klassennamen verwenden, so dass sich der foo Parameter automatisch auf foo<T> bezieht.