编译器错误C4244:'初始化' :转换自' __ int64'到' int',可能会丢失数据

时间:2014-10-02 06:17:49

标签: c++ linux windows stdvector

我正在尝试使用std :: cound而不是std :: vector。

int count = std::count( stdVector.begin(), stdVector.end(), "element" );

在Windows上,它会产生以下编译错误。

error C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data

如果我更改代码,则Windows上的编译器不会出现。

auto count = std::count( stdVector.begin(), stdVector.end(), "element" );

但是现在我在linux上面临以下错误以进行上述更改。

error: ISO C++ forbids declaration of 'count' with no type

我如何使用std::count哪个版本可以在平台上构建而没有任何错误?

2 个答案:

答案 0 :(得分:5)

您收到此警告的原因是,在64位版本中,标准容器对大小类型使用64位值,并将64位值(例如size_t)隐式转换为32位值(例如int)可能会丢失数据。

count函数返回的实际数据类型(在本例中为std::vector<T>::difference_type)可能是编译器不支持auto时使用的最佳类型。使用size_t可能也会在没有警告的情况下工作,并且输入时要短得多。

或者,如果您不担心数据丢失的风险(例如,从未计划在容器中包含超过2 ^ 32-1个对象),您可以简单地抛出警告:

int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );

答案 1 :(得分:4)

在不同的环境中,有两件事可能会有不同的冲突:

第一个是auto,因为推导类型是C ++ 11特性。可能是linux编译器没有将它作为默认值(只需使用-std=c++11,如果没有它,请升级!)

另一个是std :: count的返回类型是size_t,而不是int,而size_tint转换可能会丢失数据,具体取决于{ {1}}已定义(至少存在有符号/无符号的不匹配,并且最终两种类型的大小不同,例如size_t为32位,int为64位。