на основе диапазона для контейнеров STL - PullRequest
4 голосов
/ 29 июля 2011

Я интенсивно использую 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> > >]

Есть ли способ избежать такой неоднозначности или основан на диапазоне для простогонепригоден в такой ситуации?

1 Ответ

3 голосов
/ 29 июля 2011

Tricky.Вы добавляете std::end и boost::end, потому что связанные пространства имен std::vector<boost::shared_ptr> являются std и boost.Оба шаблона соответствуют.

Однако не шаблон end() будет еще лучше.Итак, просто укажите свое:

inline std::vector<boost::shared_ptr<Node> >::iterator
   end(std::vector<boost::shared_ptr<Node> > vsn&)
{
  return std::end(vsn); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...