Monday 15 September 2014

c++11 - begin() and end() free function overload on template -



c++11 - begin() and end() free function overload on template -

i have templated class, iterable; want overload begin() , end() free functions. stores info vector of unique_ptr, interface uses boost::indirect_iterator convenience.

my code builds , runs under clang-3.5, tried on g++-4.9 , did not. not know why ? (and compiler has right behaviour).

template<typename t> using simplevec = std::vector<t, std::allocator<t>>; template <typename t, template <typename> class container = simplevec, class string = std::string> class iterable { template <typename friendt, template <typename> class friendcontainer, class friendstring> friend boost::indirect_iterator<typename friendcontainer<std::unique_ptr<friendt>>::iterator> begin(iterable<friendt, friendcontainer, friendstring>& i); template <typename friendt, template <typename> class friendcontainer, class friendstring> friend boost::indirect_iterator<typename friendcontainer<std::unique_ptr<friendt>>::iterator> end(iterable<friendt, friendcontainer, friendstring>& i); };

and free functions :

template <typename t, template <typename> class container = simplevec, class string = std::string> boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator> begin(iterable<t, container, string>& i) { homecoming boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator>(begin(i._c)); } template <typename t, template <typename> class container = simplevec, class string = std::string> boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator> end(iterable<t, container, string>& i) { homecoming boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator>(end(i._c)); }

on g++, error :

../../api/net/session/clientsession.h:83:29: error: phone call of overloaded 'begin(groupmanager&)' ambiguous for(auto& grp : groups()) ^ ../../api/net/session/clientsession.h:83:29: note: candidates are: in file included ../../api/net/session/../permission/full/permissionmanager.h:5:0, ../../api/net/session/session.h:3, ../../api/net/session/clientsession.h:2, ../../api/net/session/clientsessionbuilder.h:2, ../client/main.cpp:2: ../../api/net/session/../permission/full/../../iterable.h:22:4: note: boost::indirect_iterator<typename friendcontainer<std::unique_ptr<friendt> >::iterator> begin(iterable<friendt, friendcontainer, friendstring>&) [with friendt = group; friendcontainer = simplevec; friendstring = std::basic_string<char>; t = permission; container = simplevec; string = std::basic_string<char>; typename friendcontainer<std::unique_ptr<friendt> >::iterator = __gnu_cxx::__normal_iterator<std::unique_ptr<group, std::default_delete<group> >*, std::vector<std::unique_ptr<group, std::default_delete<group> >, std::allocator<std::unique_ptr<group, std::default_delete<group> > > > >] begin(iterable<friendt, friendcontainer, friendstring>& i); ^ ../../api/net/session/../permission/full/../../iterable.h:142:2: note: boost::indirect_iterator<typename container<std::unique_ptr<_tp> >::iterator> begin(iterable<t, container, string>&) [with t = group; container = simplevec; string = std::basic_string<char>; typename container<std::unique_ptr<_tp> >::iterator = __gnu_cxx::__normal_iterator<std::unique_ptr<group, std::default_delete<group> >*, std::vector<std::unique_ptr<group, std::default_delete<group> >, std::allocator<std::unique_ptr<group, std::default_delete<group> > > > >] begin(iterable<t, container, string>& i) ^

so looks g++ sees friend declaration function ?

i managed find reply (which much more readable) @sehe's reply , this cppreference page.

template <typename t, template <typename> class container = simplevec, class string = std::string> class iterable { friend boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator> begin(iterable& i) { homecoming boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator>(begin(i._c)); } friend boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator> end(iterable& i) { homecoming boost::indirect_iterator<typename container<std::unique_ptr<t>>::iterator>(end(i._c)); } };

templates c++11 boost c++14 free-function

No comments:

Post a Comment