Von Lippman et al C++ Primer 5. Auflage, Abschnitt 16.1.2:Freund Vergleich und relationalen Operatoren in C++ Klassenvorlage
//forward declarations needed for friend declarations in Blob
template <typename> class BlobPtr;
template <typename> class Blob;
template <typename T> bool operator==(const Blob<T>&, const Blob<T>&)
template <typename T> class Blob {
friend class BlobPtr<T>;
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
}
Erste Frage: in der Linie
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
Warum ist die <T>
nach ==
vorhanden? Warum nicht einfach schreiben
Ich habe den folgenden Code hinzugefügt, um Operator == zu definieren und die Klassenvorlage zu instanziieren. Es kompiliert erfolgreich und Links:
template <typename T>
bool operator==(const Blob<T> &lhs, const Blob<T> &rhs) {return true;}
int main() {
Blob<int> a, b;
a == b;
}
Wenn ich entfernen die <T>
folgende operator==
in der Freund Erklärung, ich einen Linker Fehler:
Undefined symbols for architecture x86_64: "operator==(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-3ccda9.o
deutlich die <T>
folgende operator==
notwendig ist, aber warum?
Zweite Frage: Wenn ich die relationale weniger als Operator <
für die gleiche Klasse definieren wollen, ich würde vermuten, dass ich das Muster folgen sollte, die für ==
gearbeitet:
1) voraus erklären die Betreiber
2) erklären die Betreiber als Freund, Einfügen der zusätzlichen <T>
, deren Funktion die ich nicht verstehe
3) out-of-Klasse, um die Betreiber zu definieren.
Ich füge daher den folgenden Code:
template <typename T> bool operator<(const Blob<T>&, const Blob<T>&);
template <typename T> class Blob {
//other members as before
friend bool operator<<T>(const Blob<T>&, const Blob<T>&);
}
bool operator<(const Blob<T>&, const Blob<T>&) {return true;}
int main() {
//other statements as before
a < b;
}
Dies um operator<<T>
einen Kompilierungsfehler erzeugt, ich denke, da der Compiler <<
als Ausgabe-Operator interpretiert. Aber wenn ich den Freund Erklärung umschreiben als
friend bool operator<(const Blob<T>&, const Blob<T>&);
dann bekomme ich einen Linker Fehler ähnlich den früheren Linkerfehler mit ==
:
"operator<(Blob<int> const&, Blob<int> const&)", referenced from: _main in partial_blob-a85d5d.o
Wie kann ich erfolgreich Operator definiert <
für diese Klasse?
(Anmerkung:. Die Betreiber als Freunde deklariert werden muss, weil mehr vollständig realisiert Implementierungen auf private Variablen verlassen)
Denken Sie daran, dass Friend-Funktionen, die so deklariert sind, keine Member-Funktionen sind, sie sind Nicht-Member-Funktionen und ohne die '' ist die Funktion nicht abgeschlossen. Wie für 'Operator <' versuchen, ein Leerzeichen zwischen dem Operatornamen und der Vorlage wie 'Operator < ' hinzuzufügen. –
Über die undefinierte Referenz und ihre Ursache und Lösung (wie Sie bereits wissen); http://StackOverflow.com/a/35891188/3747990 – Niall
@JoachimPileborg - Können Sie einen Verweis auf eine Einführung in diese Syntax geben? Ich weiß nicht einmal, wie es heißt, also habe ich Probleme, nachzuschlagen. Ist es eine Template-Spezialisierung? Explizite Instanziierung? Websuchen nach diesen Begriffen liefern keine hilfreichen Ergebnisse. – Chad