www.mikrocontroller.net

Forum: PC-Programmierung Cast-Operator in einer template Klasse


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Ich habe ein problem mit einem cast-Operator in einer Template-Klasse. 
Konkret habe ich eine Iteratorklasse mit einen Template-Parameter auf 
was für einen Typ von Objekten der Iterator zeigt. Nun hab ich einen 
cast-operator geschrieben, der den Iterator in einen normalen Zeiger auf 
das aktuelle Element umwandelt.
template <typename T>
Iterator<T>::operator T*() const

Wenn ich aber nun den Iterator benutze, sagt der Compiler, dass kein 
Operator gefunden wurde, der diese Umwandlung ausführen könnte.
Iterator<Xyz> i(...);

Xyz* e = i;  //geht nicht
Xyz* e = (Xyz*) i; //ist genau das selbe

Hat jemand ne Idee, woran das liegt und wie man das lösen kann?

Vielen Dank!
Klaus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal etwas mehr Code.
Das sieht für mich jetzt so aus, als ob du den Konvertier Operator als 
freestanding Operator machen willst. Das geht aber nicht. Derartige 
Konvertieroperatoren müssen immer Member der Klasse (in deinem Fall 
Iterator) sein.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe ein problem mit einem cast-Operator in einer Template-Klasse.

Er heißt "Konvertierungsoperator".

> Wenn ich aber nun den Iterator benutze, sagt der Compiler, dass kein
> Operator gefunden wurde, der diese Umwandlung ausführen könnte.
>
> Iterator<Xyz> i(...);
>
> Xyz* e = i;  //geht nicht
> Xyz* e = (Xyz*) i; //ist genau das selbe

Bei mir geht das.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Header Datei steht folgendes:
template<typename T>
class Iterator
{
private:
  cList<T*>* list;
  int index;
public:
  Iterator<T>(cList<T*>* list_);
  
  //operatoren ++, --, * hab ich der wegen der Übersichtlichkeit
  //weggelassen. Sind aber keine anderen Konvertierungsoperatoren oder so
  //dabei.

  operator T*() const;

  bool end;
  bool rend;
};

template <typename T>
Iterator<T>::operator T*() const
{
  if ( end || rend ) return NULL;
  return (*list)[index];
}


Dann hab ich in einer anderen Datei zum Testen geschrieben:
Iterator<cBuilding*> i(NULL);

cBuilding* b = i;


In der Zweiten Zeile kommt dann die Fehlermeldung:

1>buildings.cpp(645) : error C2440: '=' : cannot convert from 
'Iterator<T>' to 'cBuilding *'
1>        with
1>        [
1>            T=cBuilding *
1>        ]
1>        No user-defined-conversion operator available that can perform 
this conversion, or the operator cannot be called

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Iterator<cBuilding*> i(NULL);

Setz mal für T im Template cBuilding* ein.
Aus
   operator T*() const
wird dann
   operator cBuilding* *() const

Und damit hat der Compiler recht. Er hätte zwar einen Conversion 
Operator um einen ** zu liefern, aber keinen der einen * liefert, wie er 
ihn hier
   cBuilding* b = i;
benötigen würde.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh verdammt! Das hab ich total übersehen. Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.