2014-10-27 259 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

相关问题