AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi C++ überl AnsiString operator des Variant; CB6 vs RadStudio2007
Thema durchsuchen
Ansicht
Themen-Optionen

überl AnsiString operator des Variant; CB6 vs RadStudio2007

Ein Thema von matmok · begonnen am 16. Mai 2008 · letzter Beitrag vom 16. Mai 2008
Antwort Antwort
matmok

Registriert seit: 9. Feb 2006
Ort: Köln
22 Beiträge
 
Delphi 2007 Enterprise
 
#1

überl AnsiString operator des Variant; CB6 vs RadStudio2007

  Alt 16. Mai 2008, 10:56
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

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

  Alt 16. Mai 2008, 11:48
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)
  Mit Zitat antworten Zitat
matmok

Registriert seit: 9. Feb 2006
Ort: Köln
22 Beiträge
 
Delphi 2007 Enterprise
 
#3

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

  Alt 16. Mai 2008, 12:30
...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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz