C4267:'return':从'size_t'转换为'const UINT',可能导致数据丢失

时间:2016-01-14 13:33:05

标签: c++ casting

如何使用类型转换为const UINT解决以下警告?

C4267:'return':从'size_t'转换为'const UINT',可能会丢失数据

alpha

这是对的吗?:

Class CManager
{
   std::vector<CString>    m_ncount;
   public:
    const UINT GetMCount( int nInst) const;
}


const UINT CManager::GetMCount( int nInst) const
{
     return m_ncount.size();//C4267
}

3 个答案:

答案 0 :(得分:3)

UINT(这不是标准的。unsigned int实际上是标准的)至少是16位,这意味着它是可靠的实现。不保证它可以用作index或容器size。但是,根据定义,size_t大小与sizeof运算符的输出完全相同。这保证适用于所有平台的所有情况。

因此,解决方案是使用size_t。任何其他解决方案都将忽略实际问题。感谢您的编译器警告!

答案 1 :(得分:1)

如果您可能需要在矢量中保留超过INT_MAX个项目,请使用size_t。在大多数情况下,它并不重要,但我只是使用size_t删除警告。

试试这个

std::size_t CManager::GetMCount( int nInst) const
{
     return m_ncount.size();
}

答案 2 :(得分:1)

如果您使用的是UINT,那么您可能正在使用Windows进行编码。在32位应用中,sizeof(UINT)sizeof(size_t)等于4,但在64位构建下,这不是真的,sizeof(UINT)为4,sizeof(size_t)为8。

一种解决方案是使用UINT_PTR,也可以使用添加静态断言的任何类型,例如:

static_assert(sizeof(UINT_PTR) == sizeof(size_t), "size_t must equal to ULONG_PTR");

如果您不受Windows平台及其特定类型宏定义的约束,请考虑返回size_t