Überladen des Freundesoperators & lt; & lt; für die Vorlagenklasse
Habe ich gelesen, die paar die Frage in Bezug auf mein problem auf stackoverflow jetzt, und keiner scheint mein problem zu lösen. Oder ich vielleicht es getan haben, falsch...
Die überladene <<
wenn ich es in eine inline-Funktion. Aber wie mache ich es in meinem Fall?
warning: friend declaration std::ostream& operator<<(std::ostream&, const D<classT>&)' declares a non-template function
warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
/tmp/cc6VTWdv.o:uppgift4.cc:(.text+0x180): undefined reference to operator<<(std::basic_ostream<char, std::char_traits<char> >&, D<int> const&)'
collect2: ld returned 1 exit status
Code:
template <class T>
T my_max(T a, T b)
{
if(a > b)
return a;
else
return b;
}
template <class classT>
class D
{
public:
D(classT in)
: d(in) {};
bool operator>(const D& rhs) const;
classT operator=(const D<classT>& rhs);
friend ostream& operator<< (ostream & os, const D<classT>& rhs);
private:
classT d;
};
int main()
{
int i1 = 1;
int i2 = 2;
D<int> d1(i1);
D<int> d2(i2);
cout << my_max(d1,d2) << endl;
return 0;
}
template <class classT>
ostream& operator<<(ostream &os, const D<classT>& rhs)
{
os << rhs.d;
return os;
}
InformationsquelleAutor der Frage starcorn | 2011-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist einer jener Häufig gestellte Fragen, die verschiedene Ansätze, die ähnlich sind, aber nicht wirklich das gleiche. Die drei Ansätze unterscheiden sich in, wer Sie sind, deklarieren, ein Freund zu sein von Ihrer Funktion-und dann, wie Sie es umsetzen.
Der extrovertierte
Erklären, alle instantiierungen des template-als Freunde. Dies ist, was Sie angenommen haben, als Antwort, und auch, was die meisten der anderen Antworten vorschlagen. In diesem Ansatz werden Sie nicht unnötig öffnen Ihre spezielle Instanziierung
D<T>
durch deklarieren Freunde alleoperator<<
Instanziierungen. Das iststd::ostream& operator<<( std::ostream &, const D<int>& )
hat Zugriff auf alle Interna derD<double>
.Der introvertierte
Nur erklären, eine bestimmte Instanziierung der insertion-operator als einen Freund.
D<int>
können, wie das insertion-operator bei Anwendung auf sich selbst, aber nicht wollen, etwas zu tun mitstd::ostream& operator<<( std::ostream&, const D<double>& )
.Dies kann auf zwei Arten geschehen, die einfache Art und Weise sein, wie @Emery Berger vorgeschlagen, das inlining der Betreiber-das ist auch eine gute Idee aus anderen Gründen:
In dieser ersten version, Sie sind nicht erstellen einer Vorlagen -
operator<<
ist, sondern eher eine nicht-Vorlagen-Funktion für jede Instanziierung derTest
Vorlage. Wieder, der Unterschied ist subtil, aber das ist im Grunde gleichwertig zum manuellen hinzufügen:std::ostream& operator<<( std::ostream&, const Test<int>& )
beim instanziierenTest<int>
und eine ähnliche überlastung beim instanziierenTest
mitdouble
oder mit jedem anderen Typ.Die Dritte version ist umständlicher. Ohne inlining den code, und mit der Verwendung einer Vorlage können Sie erklären, eine einzelne Instanziierung der Vorlage ein Freund der Klasse, ohne selbst zu öffnen, alle anderen instantiierungen:
Unter Ausnutzung der extrovertierte
Den subtilen Unterschied zwischen dieser Dritten option, und die erste ist, wie viel Sie öffnen, die für andere Klassen. Ein Beispiel für Missbrauch in der extrovertiert version wäre, dass jemand will, um Zugang zu Ihren Interna und tut:
InformationsquelleAutor der Antwort David Rodríguez - dribeas
Können Sie nicht erklären, einen Freund wie, dass, die Sie benötigen, wenn Sie eine andere Vorlage geben.
Hinweis
SclassT
so, dass es nicht SchattenclassT
. Bei der DefinitionInformationsquelleAutor der Antwort Nim
Dieser arbeitete für mich, ohne compiler-Warnungen.
InformationsquelleAutor der Antwort EmeryBerger
Ich denke, Sie sollten nicht Freund in den ersten Platz.
Können Sie erstellen Sie eine öffentliche Methode aufrufen, drucken, so etwas (für eine nicht-template-Klasse):
und dann, außerhalb der Klasse (aber im gleichen Namensraum)
Ich denke, es sollte funktionieren, auch für die Vorlage-Klasse, die ich aber noch nicht getestet.
InformationsquelleAutor der Antwort Alessandro Teruzzi
Hier gehen Sie:
InformationsquelleAutor der Antwort John Dibling