我有一个代码库,其中模板在一个向量中查找值,然后使用计算的索引在某个位置获取值。
以下是为视觉工作室提供的一些资料来概括:
#pragma once
#pragma warning(disable: 4514)
#pragma warning(disable: 4710)
#pragma warning(disable: 4189)
#include <vector>
int main(int, char *[])
{
//contrived example, never mind the non C4365 issues in this code
//I am aware that this makes not a lot of sense runtime wise
//This question is about a compiler warning
int target;
std::vector<char> first;
std::vector<long> second;
auto it = std::find(first.begin(), first.end(), target);
//Warning C4365 '...': conversion from '...' to '...', signed/unsigned mismatch
std::size_t pos = it - first.begin(); //from int to std::size_t
long result = second.at(pos);
return 0;
}
我特别感兴趣警告C4365。 MSDN有一个条目,还有另一个stackoverflow与此问题相关的问题。
我了解此std::size_t pos = static_cast<size_t>(it - first.begin());
会删除警告。
我的问题是,是否可以编写上述查找和获取值,以便不需要强制转换来避免警告。
编辑:我没有提到此警告是警告级别4并且默认情况下已关闭。
答案 0 :(得分:1)
下面的代码不会生成警告,因为您将int
添加到迭代器中,该迭代器有效。
int main(int, char *[])
{
//contrived example, never mind the non C4365 issues in this code
//I am aware that this makes not a lot of sense runtime wise
//This question is about a compiler warning
int target;
std::vector<char> first;
std::vector<long> second;
auto it = std::find(first.begin(), first.end(), target);
auto it2 = second.begin() + ( it - first.begin() );
long result = *it2;
return 0;
}