(Stringklasse) überladen von operator[] nicht möglic?
-
moinsen
jaja, ich bin es mal wieder, irgendwie ist wohl in meiner string klasse der wurm drin. für die, die´s noch nicht wissen, ich schreibe eine string klasse, in dieser ist der einzige member ein basic_string<TCHAR>. nun möchte ich den operator[] überladen:TCHAR& String::operator [](size_t Index) { return m_String[Index]; }
schreibe ich nun in der WinMain (bzw. _tWinMain):
String x("Hallo"); TCHAR y = x[2];
so erhalte ich folgenden fehler:
c:\My Data\Programs\JKD Engine\Main.cpp(9): error C2666: 'String::operator`[]'': 2 Überladungen haben ähnliche Konvertierungen
wenn ich den operator "unüberladen" lasse, geht alles. ich würde ihn aber gerne überladen, da mir die "undefinierte version" irgendwie unsicher vorkommt.
woran liegtr dieser fehler, und wie kann ich ihn beheben?
danke schonmal im VorAusEDIT: oh, hab grad nochn bissl probiert, und wenn ich den index zu size_t caste gehts:
TCHAR y = x[(size_t) 2];
allerdings ist diese lösung nicht so optimal, also, gibt es noch eine andere?
-
überlade auch für (unsigned) int den Operator.
Devil
-
Wie sehen denn die beiden operator[] Versionen aus?
-
@devil81: jhab ich versucht: bei unsigned gibt es den gleichen fehlöer (logisch, size_t is ja ein typedef für uint), bei "einfachem" int gehts, aber ich finde es unlogisch, einen operator[] zu haben, der negative indexes (<-???) annimmt...
@Ponto: das is es ja grade, ich habe nur eine überladung... die habe ich im erstemn posting geschrieben... sehr merkwürdig alles.....
-
Babbo schrieb:
@Ponto: das is es ja grade, ich habe nur eine überladung... die habe ich im erstemn posting geschrieben... sehr merkwürdig alles.....
Hast du etwa den schweren Fehler gemacht und einen Konvertierungsoperator von String nach char const *, oder irgendeinen Pointertyp gemacht?
Falls nicht, hast du irgendwo den Quellcode?
-
ich schreibe eine string klasse, in dieser ist der einzige member ein basic_string<TCHAR>.
öhm, du schreibst eine String Klasse, die um eine String Klasse gebaut wird? Da versteh ich den Sinn nicht so ganz.
-
Babbo schrieb:
@devil81: jhab ich versucht: bei unsigned gibt es den gleichen fehlöer (logisch, size_t is ja ein typedef für uint), bei "einfachem" int gehts, aber ich finde es unlogisch, einen operator[] zu haben, der negative indexes (<-???) annimmt...
Tchar tc= index[2];// die 2 ist ein int für den compiler.
Devil
-
Hier eine Erklärung warum eine vorhandene Konvertierung zu einem Zeigertyp den Fehler verursachen kann:
TCHAR y = x[2]
kann zweierlei bedeuten:
1. TCHAR y = String::operator[](x, 2);
2. TCHAR y = *(x+2)Wenn der erwähnte operator[] nicht existiert, versucht der Kompiler Version 2. Dies gelingt, da man x in einen Zeiger konvertieren kann, zu dem zwei addiert werden, und das Ergebnis läßt sich dereferenzieren.
Falls jedoch operator[] existiert, kommt folgendes Verhalten heraus: Sowohl 1. als auch 2. passen nicht ganz, da für den operator[] die 2 erst nach size_t gecastet werden muss und fuer die zweite Version die Konversion zum Zeiger stattfinden muss. Da also keine Version besser passt, gibt es eine Ambiguität, die der Kompiler anmeckert.
Bei der Version TCHAR y = x[(size_t) 2] gibt es keine Ambiguität, da keine einzige Konversion stattfinden muss, um operator[] aufzurufen, weil der Parameter vom Typ size_t ist.
Es gibt mindestens noch einen Grund, warum ein Konvertierungsoperator zu einem Zeigertyp böse ist:
String unschuld; delete unschuld;
Dieser Code würde ganz normal kompilieren.
-
nagut, dann lasse ich meinen operator TCHAR * eben weg... der macht ja anscheinend nur probs... gut, danke und cya^^
-
Babbo schrieb:
nagut, dann lasse ich meinen operator TCHAR * eben weg... der macht ja anscheinend nur probs... gut, danke und cya^^
Ich hatte dich gewarnt.