Friend-Deklaration einer Klassenvorlage:
Wenn Sie Zugriff auf alle Instanzen einer bestimmten Vorlage gewähren, muss keine Deklaration der Klassenvorlage oder Funktionsvorlage im Bereich vorhanden sein. Wenn Sie eine Freundschaftsbeziehung auf eine bestimmte Instanziierung beschränken möchten, müssen Sie die Klasse oder Funktion deklarieren, bevor sie in einer Freunddeklaration verwendet werden kann.
template <class T> class test { template <class U> friend ostream& operator<< (ostream &os, const test<U> &obj); //友元的所有实例均具有访问权 ... }; class test; template <class Type> ostream& operator<< (ostream &os, const test<Type> &obj); template <class T> class test { friend ostream& operator<< <T> (ostream &os, const test<T> &obj);//友元为的T类型实例才有访问权 ... };
Vorlagenkonstruktor:
Wenn in einer Vorlagenklasse der Konstruktor und der Vorlagenkonstruktor gleichzeitig vorhanden sind, wird der Konstruktor zuerst aufgerufen. Ein Vorlagenkonstruktor wird nur aufgerufen, wenn seine Schnittstelle genau erfüllt ist. Der Compiler behandelt einen Vorlagenkonstruktor niemals als Konstruktor, und selbst wenn der Client keinen Kopierkonstruktor definiert, generiert der Compiler einen Standardkopierkonstruktor.
template <class T> class test { public: test() { cout << "in my test construct" << endl;} test(const test &) { cout << "in my test copy" << endl;} template <class V> test(const test<V> &) { cout << "in my template copy" << endl;} }; int main() { test<int> t1; test<int> t2(t1); test<double> t3(t1); return 0; }
Die Vorlagenfunktion
Die Ausgabestruktur des Programms ist:
in meinem Testkonstrukt
in meiner Testkopie
in meiner Vorlagenkopie
Anwendung in Paar- und auto_ptr-Klassen von stl