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


von Klaus (Gast)


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.
1
template <typename T>
2
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.
1
Iterator<Xyz> i(...);
2
3
Xyz* e = i;  //geht nicht
4
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

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


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.

von Klaus (Gast)


Lesenswert?

In der Header Datei steht folgendes:
1
template<typename T>
2
class Iterator
3
{
4
private:
5
  cList<T*>* list;
6
  int index;
7
public:
8
  Iterator<T>(cList<T*>* list_);
9
  
10
  //operatoren ++, --, * hab ich der wegen der Übersichtlichkeit
11
  //weggelassen. Sind aber keine anderen Konvertierungsoperatoren oder so
12
  //dabei.
13
14
  operator T*() const;
15
16
  bool end;
17
  bool rend;
18
};
19
20
template <typename T>
21
Iterator<T>::operator T*() const
22
{
23
  if ( end || rend ) return NULL;
24
  return (*list)[index];
25
}


Dann hab ich in einer anderen Datei zum Testen geschrieben:
1
Iterator<cBuilding*> i(NULL);
2
3
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

von Karl H. (kbuchegg)


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.

von Klaus (Gast)


Lesenswert?

Oh verdammt! Das hab ich total übersehen. Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.