我一直在尝试摆脱一些旧代码中的警告(必须使用 MSVC 2005,目前正在使用 32 位构建),但一直在努力摆脱size_t
to unsigned int
conversion 警告。我们有自己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
,这导致编译器在传递到时将size_t
其转换/转换为(这将是不方便但可以接受的)。但是,我无法在最小工作示例(本文底部)和更复杂的最小示例中重现此警告。简单地转换参数以使警告消失并且足以满足我们的需要(根据合同,数字适合)unsigned int
i
at
unsigned int
unsigned int
- 我对
I
在unsigned int
这样的调用中的理解是否正确(规范说“ A typedef-name 因此是另一种类型的同义词。A typedef-name 不会引入新类型”,typeid(size_t(1)).name()
说unsigned int
并且size_t
似乎被typedef
喂了)。换句话说,最小的例子应该还是不应该给出警告?据我所知,构建配置是相同的。 - 由于我们的代码给了我们警告而最小的例子没有,所以我必须忽略一些东西。尽管付出了很多努力,但我无法弄清楚是什么。想法?
谢谢
最小的例子:
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;
}