Templatefunktionen in Templateklassen
-
A ist aber kein Typ sondern ein Klassen-Template. Trotzdem lässt sich innerhalb der Klasse "A" wie "A<i,c>" benutzen. Beispiel:
template<typename T> class foo { public: int operator-(foo const& rhs); // ^^^ // foo<T> bool dings(foo<int> const& xxx); }; template<typename T> int foo<T>::operator-(foo const& rhs) { // ^^^ // foo<T> return 23; } template<typename T> bool foo<T>::dings(foo<int> const& xxx) { return false; }Außerdem heißt es offiziell "class template" und "function template", wortlich übersetzt: "Klassen-Schablone" und "Funktions-Schablone". "template class" (Schablonenklasse) kann missverstanden werden. Meint man damit die ganze Familie von Klassen oder nur eine "Spezialisierung"?
Gruß,
SP
-
Hallo SP,
ohhh du möchtest mich ärgern, oder?
Viele grüße
MM
-
MrMilk schrieb:
ohhh du möchtest mich ärgern, oder?
Denke nicht, dass er das möchte. Was bringt dich auf den Gedanken? Ich denke er möchte vor allem klarmachen, dass man sich gerade bei solchen Feinheiten korrekt ausdrücken muss um nicht missverstanden zu werden.
-
Aber wieso mit einem neuen Beispiel?
Okay, Ich probiere es besser zu erklären.
Ich habe ein Klassen Template A und dieses sieht wie folgt aus:
template < int i, class c > class A { }Nun möchte ich eine Funktion foo hinzufügen, welche zwei Parameter hat und zwei Argumente von dem Klassen Template A entgegen nehmen. Wichtig für mich ist, dass die Template Parameter nicht gleich sein müssen.
sprich
template < int i, class c > void A<i,c>::foo(A<i,c> lhs, A<i,c> rhs) { }möcht ich nicht habe, da dort immer i und c identisch sind.
template < int i, class c > void A<i,c>::foo(A<i1,c1> lhs, A<i2,c2> rhs) { }So etwas möchte ich haben. Ist ungefähr klar, auf was ich abziele?
Viele Grüße
MM
-
template<int i, class c> class A { template<int i1, int i2, class c1, class c2> void foo(A<i1, c1> lhs, A<i2, c2> rhs); }; template<int i, class c> template<int i1, int i2, class c1, class c2> void A<i, c>::foo(A<i1, c1> lhs, A<i2, c2> rhs){}
-
Dann sind die Methoden wieder templates, und zwar mit den parametern der argumente als parameter (okay, klingt jetzt wirr...):
template <int i, class c> class A { template<int i1, class c1, int i2, class c2> void foo(A<i1,c1> lhs, A<i2,c2> rhs); }; template <int i, class c> template <int i1, class c1, int i2, class c2> void A<i, c>::foo(A<i1,c1> lhs, A<i2,c2> rhs) { /*...*/ }
-
Hallo MrMilk,
so wie ich deinen ersten Beitrag verstanden habe, möchtest du eine Funktion haben, welche selber wiederum Parameter vom Typ A<c, i> hat:
template<int i, typename c> void A<i,c>::foo(A<i,c> a1, A<i,c> a2) { // ... }Wenn du jedoch möchtest, daß die Parameter auch noch unterschiedlich (bezogen auf die Template-Parameter) sind, so benötigst du Element-Templates:
template < int i, typename c // ich benutze lieber typename statt class -) > template<int i1, typename c1, int i2, typename c2> void A<i,c>::foo(A<i1,c1> lhs, A<i2,c2> rhs) { }Edit: meine zweite Vermutung war also richtig...
-
MrMilk schrieb:
ohhh du möchtest mich ärgern, oder?

Eigentlich nicht. Ich war im Glauben, Deine Frage beantwortet zu haben. Ich habe Dich zumindest auf die Feinheiten der Terminologie aufmerksam gemacht.MrMilk schrieb:
Nun möchte ich eine Funktion foo hinzufügen, welche zwei Parameter hat und zwei Argumente von dem Klassen Template A entgegen nehmen.
Man kann einer Funktion kein "Klassen Template" übergeben!
MrMilk schrieb:
Wichtig für mich ist, dass die Template Parameter nicht gleich sein müssen.
Aha! Du meinst also, die Funktion soll zwei Objekte beliebiger Spezialisierungen des Klassentemplates A entgegennehmen. Dann sag das auch!
Gruß,
SP
-
Sebastian Pizer schrieb:
MrMilk schrieb:
Wichtig für mich ist, dass die Template Parameter nicht gleich sein müssen.
Aha! Du meinst also, die Funktion soll zwei Objekte beliebiger Spezialisierungen des Klassentemplates A entgegennehmen. Dann sag das auch!
Genau das meinte ich mit dem Korrekten Ausdrücken bei den gewissen Feinheiten

-
Vielen für die Hilfe an alle

Es klappt
Wieder etwas neues gelernt.
Viel Grüße
MM