Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C++ überl AnsiString operator des Variant; CB6 vs RadStudio2007 (https://www.delphipraxis.net/113887-ueberl-ansistring-operator-des-variant%3B-cb6-vs-radstudio2007.html)

matmok 16. Mai 2008 10:56


ü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:
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.
- Warum ist (AnsiString)MyVariant nicht das gleiche wie MyVariant.operator AnsiString() ?
- 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

jbg 16. Mai 2008 11:48

Re: überl AnsiString operator des Variant; CB6 vs RadStudio2
 
Zitat:

Zitat von matmok
- Warum ist (AnsiString)MyVariant nicht das gleiche wie MyVariant.operator AnsiString() ?

Im RAD Studio 2007 wurde ziemlich viel an den "Mehrdeutigkeit-Fehlern" gearbeitet.

Zitat:

- 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?
Copy-Konstruktor vor Operator? Wahrscheinlich aber auch nur ein Bug im Compiler.

Hast du alle Updates installiert? (Hab hier gerade kein RAD Studio zu Hand)

matmok 16. Mai 2008 12:30

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