![]() |
überl AnsiString operator des Variant; CB6 vs RadStudio2007
Hallo,
ich stelle im Moment meine Projekte von CBuilder6 auf RadStudio2007 um. Dabei ist mir folgendes aufgefallen: "text = AnsiString(MyVariant)" war im CB6 ok aber im RADStudio2007 wird ein Ambiguity Fehler angezeigt. Also schreibe ich stattdessen "text = MyVariant.operator AnsiString()", das ist ok. Aber "text = (AnsiString)MyVariant" geht nicht, obwohl das doch das gleiche sein sollte, oder? Da habe ich wohl ein kleines Verständnisproblem. Ein Beispiel macht es deutlich:
Delphi-Quellcode:
- Warum ist (AnsiString)MyVariant nicht das gleiche wie MyVariant.operator AnsiString() ?
Variant v;
AnsiString MeinText; MeinText = v.operator AnsiString(); // vom Variant überladener Operator "AnsiString": ok! MeinText = (AnsiString)v; // vom Variant überladener Operator "AnsiString" // - FEHLER: // [C++ Fehler] Flash_System.cpp(2017): E2015 Ambiguity between '_fastcall System::AnsiString::AnsiString(const System::AnsiString &) at D:\Borland\RAD5\Include\Vcl\dstring.h:70' and '_fastcall System::AnsiString::AnsiString(const wchar_t *) at D:\Borland\RAD5\Include\Vcl\dstring.h:72' // - sollte das nicht das gleiche sein wie .operator AnsiString() ? // MeinText = (AnsiString&)v; // kein Fehler, aber was soll das? MeinText = AnsiString(v); // Konstruktoraufruf vom AnsiString mit Übergabe Variant: // - Fehler: // [C++ Fehler] Flash_System.cpp(2017): E2015 Ambiguity between '_fastcall System::AnsiString::AnsiString(const System::AnsiString &) at D:\Borland\RAD5\Include\Vcl\dstring.h:70' and '_fastcall System::AnsiString::AnsiString(const wchar_t *) at D:\Borland\RAD5\Include\Vcl\dstring.h:72' // - War Im CB6 ok. - Wie kann ich eine Eindeutigkeit schaffen bei der Verwendung von AnsiString(MyVariant)? - Warum ist "text = (AnsiString)MyVariant" ein Konstruktoraufruf vom AnsiString (also das gleiche wie "text = AnsiString(MyVariant)") und nicht ein Aufruf des überladenen operators des Variant? ist doch komisch, oder? (CB6 und RADStudio2007 auf WinXP) mfg, Matmok |
Re: überl AnsiString operator des Variant; CB6 vs RadStudio2
Zitat:
Zitat:
Hast du alle Updates installiert? (Hab hier gerade kein RAD Studio zu Hand) |
Re: überl AnsiString operator des Variant; CB6 vs RadStudio2
...alle updates sind installiert.
Ja, Der neue Compiler besteht auf Eindeutigkeiten. Sind diese verletzt so gibt es Fehler statt wie bisher nur eine Warnung. Das finde ich gut, so wird man zu besserem Code gezwungen. Aber abgesehen vom Compiler ist es eine grundsätzliche c++ Frage; Ich dachte bisher, dass dises ein implizierter Cast ist und den überladenen Operator "AnsiString" des Variant aufruft: "(AnsiString)MyVariant". Dieses sollte also das gleiche sein wie "MyVariant.operator AnsiString()". Bei der ertsen Version scheint der Compiler es aber so zu übersetzen als wäre es ein Aufruf des AnsiString Konstruktors, also das gleiche wie "AnsiString(MyVariant)", denn die Fehlermeldung zeigt die "Ambiguity between System::AnsiString::AnsiString(...) und System::AnsiString::AnsiString(---)". Die Frage ist nun ob ich mein Verständnis von C++ rekalibrieren muß, oder ob der Compiler tatsächlich C++ falsch übersetzt, was ich mir ehrlichgesagt kaum vorstellen kann. matmok |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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