我正在尝试使用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
哪个版本可以在平台上构建而没有任何错误?
答案 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_t
到int
转换可能会丢失数据,具体取决于{ {1}}已定义(至少存在有符号/无符号的不匹配,并且最终两种类型的大小不同,例如size_t
为32位,int
为64位。