AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [VS 2003] Probleme mit template-Klassen + globalen Operators
Thema durchsuchen
Ansicht
Themen-Optionen

[VS 2003] Probleme mit template-Klassen + globalen Operators

Ein Thema von Olli · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
Olli
(Gast)

n/a Beiträge
 
#1

[VS 2003] Probleme mit template-Klassen + globalen Operators

  Alt 6. Jul 2005, 13:54
Hi,

ich habe aktuell das Problem, daß ich eine Template-Klasse habe:
Code:
   template<class T>
   class TGenPoint
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+():
Code:
   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);
   }
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!

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,
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 18:52
Jetzt bin ich mir sicher, alle Schlechtigkeit der Welt steckt in meinem Rechner (oder Nico hat meinen Rechner gehackt ).

Habe es jetzt folgendermaßen gelöst:
Code:
   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;
      }
   };
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!
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 19:00
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?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 19:09
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:
//...
class CFoo
{
//...
};
//...
template < class ELEMENT >
class TFoo : public CFoo
{
//...
            ELEMENT&   operator [] ( int a_iIndex );
    const  ELEMENT&   operator [] ( int a_iIndex ) const;
//...
};
//...
#include   "foo.inl"
//...
foo.inl
Code:
//...
template < class ELEMENT >
ELEMENT& TFoo< ELEMENT >::operator [] ( int a_iIndex )
{
//...
}
template < class ELEMENT >
const ELEMENT& TFoo< ELEMENT >::operator [] ( int a_iIndex ) const
{
//...
}
//...
Copy 'n Paste; Fehler inklusive
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 19:19
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! ) 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

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 von Olli:
(oder Nico hat meinen Rechner gehackt ).
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 19:24
Zitat von Olli:
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.
Ich kaufe ein B.

Zitat von Olli:
Und gib es zu, daß du's warst ...
OK, erwischt
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: [VS 2003] Probleme mit template-Klassen + globalen Opera

  Alt 6. Jul 2005, 19:27
Zitat von NicoDE:
Ich kaufe ein B.
Jut, dann ist die Frage ja damit erledigt. Ich werde sie also jetzt als offen markieren, liebe Moderatoren
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz