2011-07-29 9 views
4

コンテナの反復処理には大きくBOOST_FOREACHを使用していますが、最近C++ 0xに移動してからBOOST_FOREACHを範囲ベースのforコンストラクトに置き換えることができました。 STLコンテナの範囲ベース

#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); 
} 

コード

次の作品は、このような状況では、単に使用できないため、範囲基づいて、このような曖昧さを回避する方法はあります

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> > >] 

につながる、gcc 4.6でコンパイルするか、ではないでしょうか?

答えて

3

トリッキー。 std::endboost::endの関連ネームスペースはstdboostの両方であるため、あなたは引っ張ってきています。std::vector<boost::shared_ptr>です。どちらも一致するテンプレートです。

ただし、テンプレート以外のテンプレートend()はさらに優れたマッチです。だから、あなた自身を提供してください:

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

うわー、ありがとう!私は最小限の例を試してみましたが、を#includeした場合にのみ壊れます。私はそれを示すために質問を編集します。 – eudoxos

+0

ええと...各コンテナタイプのイテレータ(begin、const begin、end、const end)をこのようにラップする必要があるので、もっと普遍的なものがある方がよいでしょう。 'boost :: serialization'がサポートします。すぐに 'std :: shared_ptr'を実行して、' boost :: shared_ptr'を放棄することができます: - | – eudoxos

+2

@ eudoxos:この問題は修正される予定です(http://boost.2283326.n4.nabble.com/Range-begin-end-ADL-issues-in-C-0x-range-based-for-td3093206)。 html)をリリースしました。 –