2014-10-27 52 views
0

我環顧四周,這個錯誤對我來說似乎有點奇怪。 我環顧了像<where do I convert?> warning C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data這樣的線索,但是我的警告出現了(對於像我這樣的noob)是由其他內容引起的。初始化從unsigned int64到unsigned int的轉換

我有一個名爲「DArray.h」的頭文件,它定義並實現了動態數組的模板類。 內部數組是這樣的:

struct InternalArray 
    { 
     T element; 
     bool isAssigned; 
     void Assign(const T& in) 
     { 
      element = in; 
      isAssigned = true; 
     } 
     InternalArray() 
     { 
      isAssigned = false; 
     } 
    }; 
    InternalArray* internalArray; 

其中T是全班DArray的模板類型。

InternalArray* copyArray = new InternalArray[arraySize]; 

其中「ARRAYSIZE」是一個無符號long long類型:

每當我需要調整,內部陣列,通過製作臨時副本像這樣出現在我的警告。 對我來說,它似乎只允許我使用unsigned int類型創建一個數組,並且當我嘗試複製這樣的副本時,會自動降級'arraySize'。 我也曾嘗試:

InternalArray* copyArray = new InternalArray[dynamic_cast<unsigned long long>(arraySize)]; 

但是有人告訴我__int64是一個無效的類型的dynamic_cast。 我也試過

InternalArray* copyArray = new InternalArray[static_cast<unsigned long long>(arraySize)]; 

但是,這根本不影響警告!我也嘗試過C風格的演員。加耶我希望我不那麼笨。據我所知,這些警告是非致命的,但也有些令人擔憂。 有人可以向我解釋什麼時候我打電話給這條線嗎? 如果您有解決方案,非常歡迎!

我應該明確這一點:我不希望'arraySize'被降級爲unsigned int,int,short或其他任何東西。我希望它保持一個無符號的長整數。 除非arraySize不是要降級的項目。如果不是,那是什麼? :/ 難道你不能使用int64類型創建一個數組嗎?

+0

的參數'運營商新的[]'必須是'size_t'。如果'size_t'等於'unsigned int',你會得到這個警告。 – Barmar 2014-10-27 16:15:32

+0

'static_cast (arraySize)'很可能是你要找的東西,但老實說'arraySize'應該是一個'std :: size_t'開始(就像這整個動畫可能會更好,只是'std: :vector '。 – WhozCraig 2014-10-27 16:16:09

+0

是的,使用size_t清除它 爲什麼?不允許程序分配超出此大小的數組? – 2014-10-27 16:19:25

回答

0

您正在將一個無符號長整型轉換爲一個無符號長整型長整型,這對於解決警告的幫助很小。

你需要做到這一點把它轉換爲適當大小的整數

InternalArray* copyArray = new InternalArray[static_cast<size_t>(arraySize)]; 
+2

使用'static_cast '會更好嗎? – Barmar 2014-10-27 16:15:57

+0

同意@Barmar – 2014-10-27 16:18:21