C vector :: size_type:signed vs unsigned; int与long

前端之家收集整理的这篇文章主要介绍了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则自动返回.

猜你在找的C&C++相关文章