C vector :: size_type:signed vs unsigned; int与long
我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题.
我大量使用向量,字符串等,因此需要对它们进行计数.但是,我的函数也使用32位无符号数,因为在很多情况下我需要显式地使用正整数. 我遇到了看似简单的任务问题,例如std :: min和std :: max,这可能更系统化.请考虑以下代码: uint32_t getmax() { return _vecContainer.size(); } 看起来很简单:我知道向量不能有负数的元素,所以返回无符号整数就完全有道理了. void setRowCol(const uint32_t &r_row; const uint32_t &r_col) { myContainer_t mc; mc.row = r_row; mc.col = r_col; _vecContainer.push_back(mc); } 再次,简单. 问题: uint32_t foo(const uint32_t &r_row) { return std::min(r_row,_vecContainer.size()); } 这给了我错误,例如: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int') min(const _Tp& __a,const _Tp& __b) 我做了很多挖掘,在一个平台上,vector :: size_type是一个8字节的数字.但是,根据设计,我使用无符号的4字节数字.这可能会导致事情变得古怪,因为您无法隐式地将8字节数转换为4字节数. 解决方案是做老式的weay: #define MIN_M(a,b) a < b ? a : b return MIN_M(r_row,_vecContainer.size()); 花花公子.但系统性问题仍然存在:在规划多平台支持时,您如何处理这样的实例?我可以使用size_t作为我的标准大小,但这增加了其他复杂性(例如从支持64位数的一个平台移动到另一个支持32位数字的平台).更大的问题是size_t是无符号的,所以我无法更新我的签名: size_t foo(const size_t &r_row) // bad,this allows -1 to be passed,which I don't want 有什么建议? 编辑:我读过size_t签名的地方,我已经纠正了.到目前为止看起来这是我自己设计的限制(例如32位数字与使用std :: vector :: size_type和/或size_t). 解决方法
解决这个问题的一种方法是使用
std::vector<Type>::size_type 作为函数参数/返回的基础类型,如果使用C 14则自动返回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 在执行原始SQL后,是否应该调用PG :: Resu
- Swift设计模式之创建者模式
- c# – 如何在WPF中动态绘制时间轴
- xml解析1:java dom ? xml解析模板及原理
- oracle不能使用EM怎么办 oracle11g如何正确安装配置EM
- CAP理论十二年回顾:"规则"变了
- Kotlin难点解析:extension和this指针
- winform中,使用openfileDialog而引起的“Unable to open th
- objective-c – 使用不兼容类型’id’的表达式初始化’doub
- Oracle数据库经常会遇到CPU利用率很高的情况