Nochmal: friend Funktion innerhalb einer Template-Klasse
-
Servus zusammen:
Um einer Antwort zuvorzukommen: Ja, ich habe die Suche benutzt. Ich habe sogar folgenden Thread gefunden, der _genau_ mein Problem beschreibt, allerdings behebt dieser selbiges nicht:
Bei diesem Code (kopiert aus dem besagten Thread) bekomme ich folgenden Fehler (Compiler: g++):
13 C:\code\cpp\test.cpp declaration of `class T' 4 C:\code\cpp\test.cpp shadows template parm `class T'
#include <iostream> using namespace std; template <class T > class Foo { public: Foo(T value) { this->value = value; } template <class T> friend ostream &operator<<(ostream &out, const Foo<T> &o); private: T value; }; template <class T> ostream &operator<<(ostream &out, const Foo<T> &o) { out<<o.value; return out; }; int main() { cout<<"Hallo Welt!"<<endl; Foo <int> t(2); cout<<t<<endl; return 0; }
Ich bin ziemlich ratlos... Wäre schön wenn mich jemand aufklären könnte
Caipi
-
template <class NotNamedT> friend ostream &operator<<(ostream &out, const Foo<NotNamedT> &o);
-
finix schrieb:
template <class NotNamedT> friend ostream &operator<<(ostream &out, const Foo<NotNamedT> &o);
Super, das war es. Danke!
Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann?
Auch hier würde ich mich über eine Aufklärung sehr freuen.P.S.: Sorry, für meine verspätete Reaktion. War bis vorhin weg...
Caipi
-
*push*
-
Caipi schrieb:
Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann?
Das trifft es ungefähr ganz gut. (Obwohl ich mir nicht sicher bin was du mit dem von mir unterstrichenen Teil meinst.) Die Templateparameter T und NotT haben nichts miteinander zu tun.
template <class T> class Foo { public: Foo(T value) : value(value) { } template <class NotT> friend NotT whatever( const NotT& p ); private: T value; }; template <class NotT> NotT whatever( const NotT& p ) { Foo<int> bar(42); return (bar.value < 1000000) ? -p : p; } int main() { double x = whatever(3.0); }
-
finix schrieb:
Caipi schrieb:
Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann?
Das trifft es ungefähr ganz gut. (Obwohl ich mir nicht sicher bin was du mit dem von mir unterstrichenen Teil meinst.) Die Templateparameter T und NotT haben nichts miteinander zu tun.
Soweit ich weiß wird eine Template-Klasse und deren Methoden mit dem übergebenen Typ (der in der Klasse mit dem Typ-Namen T angesprochen wird) instantiiert. Und da die entsprechende friend-Funktion im Prinzip nichts mit der eigentlichen Klasse (und diesem Typ) zu tun hat, kann sie nicht mit dem gleichen Typ-Namen (im Beispiel T) instantiiert werden. Sehe ich das richtig?
Caipi
-
Machs doch nicht so kompliziert. Das Problem ist im Prinzip das selbe wie hier:
int foo = 5; ... int foo = 10;
-
@all: Danke. Ich glaube jetzt hab ich es endlich verstanden.
Caipi