- Kod: Zaznacz cały
Variant temp;
TDateTime date = TDateTime().CurrentDate();
temp = date; // typ variant przechowuje TDateTime
TDateTime date2 = temp; // do date2 przypisujemy variant ktory faktycznie jest TDateTime
ten kod dziala.
natomisat to:
- Kod: Zaznacz cały
class Test
{
public:
TDateTime t;
};
Variant temp;
TDateTime date = TDateTime().CurrentDate();
temp = date; // typ variant przechowuje TDateTime
Test date2;
date2.t = temp; // do date2.t (ktore jest TDateTime) przypisujemy variant ktory faktycznie jest TDateTime
powoduje blad:
[BCC32 Error] Unit1.cpp(29): E2015 Ambiguity between '_fastcall operator System::TDateTime::=(const System::TDateTime &) at c:\program files\codegear\rad studio\5.0\include\vcl\systdate.h:58' and '_fastcall operator System::TDateTime::=(const double) at c:\program files\codegear\rad studio\5.0\include\vcl\systdate.h:60'
rozumiem co oznacza blad ale nie rozumiem czemu w przypadku 1 jest ok a w 2 juz nie.
czemu tak sie dzieje? problem wystepuje w C++Builder 2007.
przenosze projekt z TurboC++ (C++Builder 2006) gdzie obydwa przypadki dzialaja poprawnie do C++Builder 2007 i tutaj mam ten problem.
C++Builder 2007 zawiera wszystkie aktualizacje.
TDateTime jest tu przykladem, w przypadku AnsiString jest to samo. Dla zmiennych prostych wszystko gra bo tam nie ma konstruktorow.
EDIT:
typ Variant ma zdefiniowane operatory konwersji, miedzy innymi dla TDateTime.
to powinno wywolac owy operator ale tego nie robi.
- Kod: Zaznacz cały
date2.t = temp;
dopiero jawne wywolanie operatora konwersji przechodzi:
- Kod: Zaznacz cały
date2.t = temp.operator TDateTime();
czemu w pierwszym przedstawionym przypadku operator konwersji jest wywolywany niejawnie czyli tak jak powinno byc a w drugim juz nie?





TDataTime