STL - 基于 STL 容器的范围

标签 stl for-loop c++11

我大量使用 BOOST_FOREACH 来迭代容器,并且由于我最近转向 c++0x,我认为我可以用基于范围的 替换 BOOST_FOREACH >for 构造。下面这段代码

#include<vector>
#include<boost/shared_ptr.hpp>
#include<boost/range.hpp>
using std::vector; using boost::shared_ptr;
class Node;
int main(void){
   vector<shared_ptr<Node>> nodes;
   for(const shared_ptr<Node>& n: nodes);
}

无法使用gcc 4.6进行编译,导致

error: call of overloaded 'end(std::vector<boost::shared_ptr<Node> >&)' is ambiguous
note: candidates are:
/usr/include/c++/4.6/bits/range_access.h:78:5: note: decltype (__cont->end()) std::end(const _Container&) [with _Container = std::vector<boost::shared_ptr<Node> >, decltype (__cont->end()) = __gnu_cxx::__normal_iterator<const boost::shared_ptr<Node>*, std::vector<boost::shared_ptr<Node> > >]
/usr/include/c++/4.6/bits/range_access.h:68:5: note: decltype (__cont->end()) std::end(_Container&) [with _Container = std::vector<boost::shared_ptr<Node> >, decltype (__cont->end()) = __gnu_cxx::__normal_iterator<boost::shared_ptr<Node>*, std::vector<boost::shared_ptr<Node> > >]
/usr/include/boost/range/end.hpp:103:47: note: typename boost::range_iterator<const T>::type boost::end(const T&) [with T = std::vector<boost::shared_ptr<Node> >, typename boost::range_iterator<const T>::type = __gnu_cxx::__normal_iterator<const boost::shared_ptr<Node>*, std::vector<boost::shared_ptr<Node> > >]
/usr/include/boost/range/end.hpp:92:41: note: typename boost::range_iterator<C>::type boost::end(T&) [with T = std::vector<boost::shared_ptr<Node> >, typename boost::range_iterator<C>::type = __gnu_cxx::__normal_iterator<boost::shared_ptr<Node>*, std::vector<boost::shared_ptr<Node> > >]

有没有办法避免这种歧义,或者基于范围的方法在这种情况下根本无法使用?

最佳答案

棘手。你正在拉进来std::endboost::end因为 std::vector<boost::shared_ptr> 的关联命名空间都是stdboost 。两者都是匹配的模板。

但是,非模板end()将是一个更好的匹配。因此,只需提供您自己的:

inline std::vector<boost::shared_ptr<Node> >::iterator
   end(std::vector<boost::shared_ptr<Node> > vsn&)
{
  return std::end(vsn); 
}

关于STL - 基于 STL 容器的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6871271/

相关文章:

c++ - 当我们在 vector 上使用 unique 函数时,移位是如何工作的?

c++ - 为什么我们仍然需要定义我们自己的函数比较器

Excel VBA - 对于下一个循环 - 查找显示列的列号和存储的结果

jquery - 查找 child 最多的元素

c++ - 静态模板成员函数的实例化?

c++ - 包装 STL 习惯用法以提高可读性是个好主意吗?

c++ - 奇怪的 std::distance 输出

python - API 上的 For 循环

c++ - 我无法正确输出我的程序

c++ - 为什么在 C++11 的基于范围的 for 中需要按值捕获