![]() |
[VS 2003] Probleme mit template-Klassen + globalen Operators
Hi,
ich habe aktuell das Problem, daß ich eine Template-Klasse habe:
Code:
Diese benutze ich mit <T = int>. Für diese Punktklasse habe ich noch ein paar globale binäre symmetrische Operatoren (+/-) überladen, damit bestimmte Operationen vereinfacht werden. Beispiel operator+():
template<class T>
class TGenPoint
Code:
Komischerweise gibt es keinerlei Probleme dies mit VC6 zu kompilieren und auszuführen. Weil ich aber auf VS 2003 umsteigen muß, habe ich es dort versucht. Das Problem welches jetzt noch bestehen bleibt ist, daß vom Linker alle diese benutzten Operatoren nicht spezialisiert mit <T=int> gefunden werden! Aber wie gesagt: erst vom Linker!
template<class T>
TGenPoint<T> operator+(const TGenPoint<T>& LValue, const TGenPoint<T>& RValue) { return TGenPoint<T>(LValue.x + RValue.x, LValue.y + RValue.y); } Unter VC6 trat das Problem nie auf und es ist mir ein Rätsel. Die template-Klasse ist zusammen mit den globalen Operatoren direkt in einer Headerdatei deklariert. Hat jemand eine Lösungsidee? Danke, |
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Jetzt bin ich mir sicher, alle Schlechtigkeit der Welt steckt in meinem Rechner (oder Nico hat meinen Rechner gehackt :mrgreen:). :lol:
Habe es jetzt folgendermaßen gelöst:
Code:
Allerdings stellt sich mir jetzt die Frage, ob friend garantiert, daß die Funktion an sich als außerhalb des Scopes der Klasse betrachtet wird. Es sollen immerhin globale Operatoren sein!
template<class T>
class TGenPoint { // ... friend bool operator==(const TGenPoint<T>& LValue, const TGenPoint<T>& RValue) { return ((LValue.x == RValue.x) & (LValue.y == RValue.y)); } friend bool operator!=(const TGenPoint<T>& LValue, const TGenPoint<T>& RValue) { return !(LValue == RValue); } friend ostream& operator<<(ostream& os, const TGenPoint<T>& pt) { os << pt.x << "/" << pt.y; return os; } }; |
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Also, um meine Fragestellung nochmal anzupassen:
Gibt es eine Möglichkeit für die friend-Funktionen von template-Klassen den Funktionskörper außerhalb der Klasse zu deklarieren ohne dafür die (Template-)Funktion spezialisieren zu müssen? |
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Ich kann dir zwar (mangels VS71 auf diesem OS) die Frage vorerst nicht beantworten, aber bei Templates benutze ich seit geraumer Zeit .inl für die Implementation von Templates in Headern...
foo.hpp
Code:
foo.inl
//...
class CFoo { //... }; //... template < class ELEMENT > class TFoo : public CFoo { //... ELEMENT& operator [] ( int a_iIndex ); const ELEMENT& operator [] ( int a_iIndex ) const; //... }; //... #include "foo.inl" //...
Code:
Copy 'n Paste; Fehler inklusive :D
//...
template < class ELEMENT > ELEMENT& TFoo< ELEMENT >::operator [] ( int a_iIndex ) { //... } template < class ELEMENT > const ELEMENT& TFoo< ELEMENT >::operator [] ( int a_iIndex ) const { //... } //... |
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Include ist ne Idee. Allerdings macht dessen Verwendung bei mehreren Klassen in meinem Header auch mehrere Dateien oder Präprozessordirektiven (dafür müßte ich nachdenken! :stupid: ) nötig. Fällt also flach wegen is nicht. Zumindest solange wie es mit der aktuellen Variante geht. Bei Template-Klassen und -Funktionen kann man sowieso nicht Implementation und Deklaration sinnvoll trennen :mrgreen:
Außerdem geht deine Methode etwas an meiner Frage vorbei. Es geht ja nicht um Methoden der Klasse, bei denen ich Rumpf und Kopf trennen will, sondern vielmehr um friends, welche als globale Operatoren dienen sollen. Und genau da weigert sich mein VS einen solchen globalen Operator als friend-Templatefunktion zuzulassen. Der Linker findet sie einfach nicht, weil sie offenbar nicht explizit spezialisiert (<T = int>) wurde. Die verbleibende Frage ist eben, ob mit der aktuellen Methode a.) friend ignoriert wird, oder b.) friend dazu dient daß die jeweilige Funktion als außerhalb des Scopes der Klasse betrachtet wird. Und gib es zu, daß du's warst ... Zitat:
|
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Zitat:
Zitat:
|
Re: [VS 2003] Probleme mit template-Klassen + globalen Opera
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz