我尝试在std::vector上使用std::count,如下所示:
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?
发布于 2014-10-02 14:23:26
在不同的环境中,有两件事可能会有不同的冲突:
第一个是auto,因为推导出来的类型是C++11特性。可能linux编译器没有将其作为缺省设置(只需使用-std=c++11,如果没有,请升级!)
另一个是std::count的返回类型是size_t,而不是int,size_t到int的转换可能会丢失数据,这取决于size_t是如何定义的(至少存在有符号/无符号的不匹配,最终两种类型的大小不同,比如32位用于int,64位用于size_t)。
发布于 2014-10-02 14:21:34
您收到此警告的原因是,在64位构建上,标准容器使用64位值作为大小类型,并且隐式地将64位值(例如size_t)转换为32位值(例如int)可能会丢失数据。
如果您的编译器不支持std::vector<T>::difference_type,则count函数返回的实际数据类型(在本例中为auto )可能是最好的类型。使用size_t可能也会在没有警告的情况下工作,而且键入起来要短得多。
或者,如果你不担心数据丢失的风险(例如,你永远不会计划在容器中拥有超过2^32-1个对象),你可以简单地抛出警告:
int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );https://stackoverflow.com/questions/26155376
复制相似问题