【发布时间】:2012-04-04 21:22:54
【问题描述】:
我一直试图摆脱一些旧代码中的警告(必须使用 MSVC 2005,目前正在使用 32 位构建),但一直在努力摆脱 size_t 到 @987654322 @转换警告。我们有自己的Array<T> 实现了一个不断增长的数组,它实现了一个
template<typename I> const T& at(const I i) const {return atImpl(i);}
方法。当被称为
size_t i = 10; myArray.at(i);
我收到conversion from 'size_t' to 'const unsigned int', possible loss of data 警告。 工作理论认为I 被理解为unsigned int,这导致编译器在将i 传递给at 时将size_t 转换/转换为unsigned int(这会很不方便,但可以接受)。但是,我无法在最小工作示例(本文底部)和更复杂的最小示例中重现此警告。只需将参数转换为 unsigned int 即可使警告消失,足以满足我们的需求(根据合同,该数字适合 unsigned int)
- 我对
I在这样的调用中的理解是否正确(规范说“typedef-name 因此是另一种类型的同义词。typedef-name 确实 不引入新类型”,typeid(size_t(1)).name()说unsigned int和size_t似乎是typedeffed)。换句话说,是否应该或不应该最小示例给出警告?构建配置是一样,据我所知。 - 由于我们的代码给了我们警告而最小的例子没有,所以我必须忽略一些事情。尽管付出了很多努力,但我无法弄清楚是什么。想法?
谢谢
最小的例子:
template<typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i) { return t;}
};
int main()
{
size_t i = 10;
A<int> a;
a.at(i) = 5; // no warning, why?
return 0;
}
【问题讨论】:
-
您是否有机会使用
/Wp64选项?它会警告size_t在 64 位模式下的大小不同,但unsigned int没有。 -
如果您正在努力使代码可移植,您应该考虑在您的
MyVector类型上使用std::size_t,而不是考虑警告是否有意义。总有一天,您将更改架构(64 位),size_t的大小可能不同,您将不得不返回并重新查看所有警告......当然,除非该参数不是用于访问容器,而是用于以其他形式存储。 -
如果
atImpl采用unsigned,那么警告是否源于atImpl(i),它实际上在传递std::size_t参数时会执行std::size_t到unsigned的转换?跨度> -
好的,问题:为什么你有自己的
std::vector实现? -
@CharlesBailey 是的,我正在使用 /Wp64
标签: c++ templates visual-c++-2005 size-t visual-studio