首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器错误C4244:‘初始化’:从'__int64‘转换为'int',可能会丢失数据

编译器错误C4244:‘初始化’:从'__int64‘转换为'int',可能会丢失数据
EN

Stack Overflow用户
提问于 2014-10-02 14:17:49
回答 2查看 11.6K关注 0票数 5

我尝试在std::vector上使用std::count,如下所示:

代码语言:javascript
复制
int count = std::count( stdVector.begin(), stdVector.end(), "element" );

在windows上,它给出以下编译器错误。

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

如果我像下面这样修改代码,Windows编译器就不会出现。

代码语言:javascript
复制
auto count = std::count( stdVector.begin(), stdVector.end(), "element" );

但是,现在我在linux上遇到了上述更改的错误。

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

如何使用在两个平台上都能顺利构建的std::count

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-02 14:23:26

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

第一个是auto,因为推导出来的类型是C++11特性。可能linux编译器没有将其作为缺省设置(只需使用-std=c++11,如果没有,请升级!)

另一个是std::count的返回类型是size_t,而不是intsize_tint的转换可能会丢失数据,这取决于size_t是如何定义的(至少存在有符号/无符号的不匹配,最终两种类型的大小不同,比如32位用于int,64位用于size_t)。

票数 6
EN

Stack Overflow用户

发布于 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个对象),你可以简单地抛出警告:

代码语言:javascript
复制
int count = static_cast<int>( std::count(stdVector.begin(), stdVector.end(), "element") );
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26155376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档