6

I'm having such two typedefs:

typedef std::vector<int> Container;
typedef std::vector<int>::const_iterator Iter;

In the problem that I consider, I perform some operations on Container Input, and after that I would like to compute std::distance(Input.begin(),itTarget), where itTarget is of the Iter type. But I'm getting this compiler error that no instance of function template "std::distance" matches the argument list, and only after casting, i.e., std::distance(static_cast<Iter>(Input.begin()),itTarget) everything works fine.

I wonder why is that?

4

2 回答 2

8

std::distance是一个模板函数,它不能接受不同的参数。你需要使用:

std::distance(Input.cbegin(),itTarget);
                    ^^

std::vector::cbegin链接

于 2013-06-25T09:52:31.713 回答
5

Input.begin()返回 aniterator而不是 a const_iterator,并且您的第二个参数是 a const_iterator,因此这两个参数基本上属于不同的类型。cbegin()如果您有权访问 C++11 功能,则可以使用。

第二种方法:每个迭代器都可以通过赋值转换为 const_iterator

std::vector<int> myVector(100);
std::vector<int>::iterator it = myVector.begin();
std::vector<int>::const_iterator cit = it;

如果你必须将东西打包到函数调用中,你可以使用一些施法魔法:

std::distance( ((const Container*)&Input)->begin(), itTarget );

如果 Input 是 const,则编译器被迫使用 begin() 的 const 版本,它返回一个 const_iterator。

于 2013-06-25T09:55:13.647 回答