2011-08-22 74 views
2

我在VC9中构建库时遇到了问题,但之前成功构建于VC6中。 下面是代码的一部分:使用C++中的指针初始化迭代器

size_t pos2find; 
pos2find = J; 
std::vector<size_t>::iterator it(&pos2find); 

这里是错误:

error C2664: 'std::_Vector_iterator<_Ty,_Alloc>::_Vector_iterator(const std::_Vector_iterator<_Ty,_Alloc> &)' : cannot convert parameter 1 from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc> &' 
    1>  with 
    1>  [ 
    1>   _Ty=size_t, 
    1>   _Alloc=std::allocator<size_t> 
    1>  ] 
    1>  Reason: cannot convert from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc>' 

1>  with 
1>  [ 
1>   _Ty=size_t, 
1>   _Alloc=std::allocator<size_t> 
1>  ] 
1>  No constructor could take the source type, or constructor overload resolution was ambiguous 

我感谢所有帮助。

编辑: 该代码来自一个名为“surfit”的开源库,它不是我的代码,所以我猜这是在矢量类的标准中发生了变化。 迭代器,然后在另一个STD功能使用:

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin; 
std::vector<size_t>::iterator * ptr; 
ptr = std::lower_bound(ptr_from, 
       fault->sort_by_first_end, 
       it, 
       ptr_size_t_less); 

编辑: 我想我找到了解决办法。寻找到的std ::后LOWER_BOUND():

template <class ForwardIterator, class T, class Compare> 
    ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, 
           const T& value, Compare comp); 

Return iterator to lower bound 
Returns an iterator pointing to the first element in the sorted range [first,last) which does not compare less than value. The comparison is done using either operator< for the first version, or comp for the second. 

For the function to yield the expected result, the elements in the range shall already be ordered according to the same criterion (operator< or comp). 

有了这个,我只是消除了它的迭代器和使用LOWER_BOUND(第一,最后,& pos2find,COMP);

+1

作为一个常规提示:msvc6是如此的破坏和预标准,以致为它编写的大量代码将不能用符合标准的编译器进行编译。它甚至不支持正确的循环变量范围,直到后来的某个Service Pack。 – PlasmaHH

+0

我想尽可能多。但是,也许有人认为这种情况有一个解决方法。 – Adrian

回答

4

向量中的迭代器不保证是一个原始指针。在VS6中vector<T>::iterator发生了T*,因此您可以使用T*初始化迭代器。 在较新版本的VS中,vector<T>::iterator的实现更改为类类型(因为它有权使用),因此做出错误假设的代码现在无法编译。

在任何情况下,即使iteratorT*,您发布的代码也是错误的,因为提供的指针不是指向矢量的指针。

4

那么,即使在VC6中,发布的代码也没有任何意义。但是,也许你正在寻找这样的事情

std::vector<size_t>::iterator it = some_vector.begin() + pos2find; 

如果没有,那么你最好张贴更多的代码,所以我们可以看到你如何试图使用迭代器。

+0

我希望是这种情况,但迭代器然后用于从标准更复杂的方法。 – Adrian

+0

@阿德里安,看到我的新尝试来解释这一点。 – john

2

原始代码依赖于标准没有保证的实现细节,即迭代器可以实现为指针的事实。我不确定这是否仍然如此,但是在更高版本的Visual C++中实现更改为特定的类模板。

恐怕你必须经历所有的代码和解决的事情,更何况,因为它已经被指出的那样,你的例子是越野车即使考虑到我刚才写的。

要注意的是使用指针,你可以用0表示“迭代器没有设置”,这将是从分配some_vector.end()不同。如果遇到类似的情况,我建议你使用Boost.Optional来包装你的迭代器。

去过那里,这样做(但使用不同的编译器)。

1

下似乎什么打算

std::vector<size_t> tmp; 
tmp.push_back(J); 
std::vector<size_t>::iterator it = tmp.begin(); 

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin; 
std::vector<size_t>::iterator * ptr; 
ptr = std::lower_bound(ptr_from, 
       fault->sort_by_first_end, 
       it, 
       ptr_size_t_less); 

疯狂代码(迭代器的排序阵列,真的吗?),并且未经我测试。

+0

是的,这是一个好主意,但只是发现我可以用&pos2find替换它。感谢您的支持。 – Adrian