2015-11-05 96 views
2

我可以成功編譯C++ Builder 6中的代碼片段。C++ Builder 6和C++ Builder Seatle For IntToStr方法有什麼區別?

但是我無法在Rad studio Seatle C++ Builder中編譯。

unsigned long x = 50; 
    String s = IntToStr(x); 

[bcc32錯誤] Unit1.cpp(55):E2015歧義_fastcall 系統之間」 :: sysutils的:: IntToStr(INT)在C:\程序文件 (86)\ Embarcadero的\工作室\ 17.0 \ include \ windows \ rtl \ System.SysUtils.hpp:3182' and'_fastcall System :: Sysutils :: IntToStr(__ int64)at c:\ program files (x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ System.SysUtils.hpp:3183'

我也檢查過IntToStr的定義。

C++生成器6

extern PACKAGE AnsiString __fastcall IntToStr(int Value)/* overload */; 
extern PACKAGE AnsiString __fastcall IntToStr(__int64 Value)/* overload */; 

C++生成器Seatle

extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(int Value)/* overload */; 
extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(__int64 Value)/* overload */; 
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned Value)/* overload */; 
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned __int64 Value)/* overload */; 

有什麼C++生成器6和C++ Builder Seatle之間的差異?

回答

3

基本上在這種情況下存在一個歧義,意味着有IntToStr的兩個重載,期待不同的參數類型(INT的int64)。含糊不清的是將提供的long類型降級爲int或將其升級到int64。 這裏的參數應該是cast-ed到最匹配的類型。

+0

我知道IntToStr方法是重載和不同的參數types.But 我不知道C++ builder 6和C++ builder seatle之間的區別。 –

+2

構建器6隱式地將無符號值轉換爲其中一種簽名類型,新構建器(自2010年以來)默認情況下不會這樣做,您需要將其明確轉換爲已簽名類型或使用未簽名替代方法。 –

+0

如果這個解決方案正在工作,請不要忘記它爲up-vote和標記爲答案 –

2

除了什麼@Ali卡茲米說,對於未簽名你需要使用的最後2之一,因爲你的價值是無符號:

UIntToStr() 

我想那麼它不會要求你投的價值,它應該編譯。

生成器6隱含鑄造無符號值已簽署的類型之一,新的建築工地(2010年以來)沒有這樣做在默認情況下,你需要明確地將它轉換爲一個帶符號的類型或使用無符號替代

+0

'unsigned long x = 50; String s = UIntToStr(x);'不能編譯。 我發現了ULongToChar方法,但我想要很長的字符串 –

+0

另一件需要注意的事情,在Builder 6中,一切都是'AnsiString'和'String'類型,確保'String'是當前的。也許它仍然是'AnsiString',然後你需要'UnicodeString s = UIntToStr(x);' –

+0

這個問題是隱式的還是明確的?我想知道這個.. –

0

您可以通過只使用強大的UnicodeString類本身的重載構造一個降低找到正確的轉換功能爲每個變量類型的複雜性(如你在德爾福做),例如:

unsigned long x = 50; 
String s(x); 

而且,你可以寫字符串(MyVariableName任何地方在您的代碼中獲得的UnicodeString表示形式爲MyVariableName

在舊的CBuilder版本中,字符串的類型定義AnsiString。 時下,這是一個UnicodeString的typedef。