我正试图使用std::count而不是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
,它将在两个平台上构建而不会出现任何错误?
在不同的环境中,有两件事可能会发生不同的冲突:
第一个是auto
,作为一个推导类型是C++11的特征。可能是linux编译器没有默认值(只需使用-std=c++11
,如果没有,请升级!)
另一种是std::count的返回类型是size_t
,而不是int
,并且size_t
到int
的转换可能会丢失数据,这取决于size_t
的定义方式(至少存在有符号/无符号不匹配,并且最终两种类型的大小不同,如int
的32位和size_t
的64位)。
收到此警告的原因是,在64位构建中,标准容器使用64位值作为大小类型,而将64位值(例如size_t
)隐式转换为32位值(如int
)可能会丢失数据。
如果编译器不支持auto
,那么count
函数返回的实际数据类型(在本例中为std::vector<T>::difference_type
)可能是最好的类型。使用size_t
可能也会在没有警告的情况下工作,并且键入时间要短得多。
或者,如果您不担心数据丢失的风险(例如,从未计划在容器中有超过2^32-1个对象),您可以简单地放弃警告:
int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );