如何使用类型转换为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
}
答案 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
。