我已经更新到了更新的C ++编译器(从Visual C ++ 6.0到Visual C ++ 2015),并且我正在努力将Vector模板类转换为兼容的。我遇到的一个错误涉及vector :: erase方法和输入类型。
模板类代码段:
template<class Type> class Vector {
public:
typedef Type* iterator;
typedef const Type* const_iterator;
...
iterator erase( const_iterator iBegin );
iterator erase( const_iterator iBegin, iEnd );
private:
VectorImpl<Type>* m_pImpl;
};
...
template <typename Type> typename Vector<Type>::iterator Vector<Type>::erase(
typename Vector<Type>::const_iterator iBegin )
{
return m_pImpl->erase( iBegin );
};
...
错误:
C2440:“正在初始化”:无法从“ const int *”转换为“ std :: _ Vector_const_iterator >>”
通过解引用迭代器,我能够将std :: vector迭代器转换为int *,但是我不确定如何进行逆操作:
template <typename Type> typename Vector<Type>::const_iterator Vector<Type>::begin()
{
Vector<Type>::const_iterator begin = &(*m_pImpl->begin());
return begin;
};
问:是否可以将const int *转换为std :: vector const_iterator?
答案 0 :(得分:1)
通过解引用迭代器,我能够将std :: vector迭代器转换为int *,但是我不确定如何进行逆操作
您应该记住,指针和迭代器不是一回事。指针是一种迭代器,但事实并非如此。
您可以通过将某个迭代器带到该元素,然后取消对该迭代器的引用,然后获取结果的地址来获取某个元素的地址。
但是将原始指针转换为迭代器并不是特别有意义。通常,这就像将一些橙汁倒入水中,然后尝试将两者分开。建议全面坚持使用迭代器。
但是,请参见下文。
是否可以将const int *转换为std :: vector const_iterator?
实际上,是的。如果您知道该指针有效,并且肯定只使用向量,则可以依靠向量数据连续性:
const int* ptr = ...;
const int* first = &vec[0];
const size_t dist = ptr - first;
auto it = vec.cbegin() + dist;
现在it
是您想要的。
但这是黑客依赖指针和迭代器算法的方法,前者将仅对向量起作用,而后者仅对序列容器有效(并且需要{{ 1}},因此将其放在其他容器上。
如果没有很好的理由受第三方库的限制,我不会在生产代码中接受这一点。
在我看来,您应该将std::advance
换成Vector
。我知道,如果您不能(或不想)更改代码的向外接口,则可能会遇到问题。坦率地说,在那种情况下,我将std::vector
排除在外,因为这是两个相互独立的实现。