Prev: Is it possible to use object functions as arguments to the inner_product algorithm?
Next: Using std container to hold boost::shared_ptr with template parameter
From: Jardel Weyrich on 22 Mar 2010 03:04 Compiling the program below, gives these 2 errors: 1. test.cpp:10: error: type �std::set<boost::shared_ptr<X>, std::less<boost::shared_ptr<X> >, std::allocator<boost::shared_ptr<X> > >� is not derived from type �A<T>� 2. test.cpp:10: error: expected �;� before �iterator� However, if I "typedef int type", it compiles fine. The Boost documentation mentions the following: "Every shared_ptr meets the CopyConstructible and Assignable requirements of the C++ Standard Library, and so can be used in standard library containers. Comparison operators are supplied so that shared_ptr works with the standard library's associative containers. The class template is parameterized on T, the type of the object pointed to. shared_ptr and most of its member functions place no requirements on T; it is allowed to be an incomplete type, or void. Member functions that do place additional requirements (constructors, reset) are explicitly documented below." I thought the std allocator or the comparison operator could be the cause, but I don't see a reasonable explanation for this. Any clue? -code- #include <boost/shared_ptr.hpp> #include <set> template <class T> class A { public: typedef T type; typedef boost::shared_ptr<type> shared_type; typedef std::set<shared_type> container; typedef container::iterator iterator; }; -- jardel [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
From: Paul Bibbings on 22 Mar 2010 08:22 Jardel Weyrich <jweyrich(a)gmail.com> writes: > -code- > #include <boost/shared_ptr.hpp> > #include <set> > > template <class T> > class A { > public: > typedef T type; > typedef boost::shared_ptr<type> shared_type; > typedef std::set<shared_type> container; > typedef typename container::iterator iterator; > }; ^^^^^^^^ Whenever you construct a sequence of typedefs like this, it's easy to forget that you started out with a template. Effectively, your last line equates to: std::set<boost::shared_ptr<T> >::iterator which is clearly parameterized on T. You need to tell the compiler that ....::iterator in the above line represents a type. Regards Paul Bibbings -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
From: James Lothian on 22 Mar 2010 08:23
Jardel Weyrich wrote: > -code- > #include<boost/shared_ptr.hpp> > #include<set> > > template<class T> > class A { > public: > typedef T type; > typedef boost::shared_ptr<type> shared_type; > typedef std::set<shared_type> container; > typedef container::iterator iterator; > }; > I don't have boost::shared_ptr handy to try this out with, but I think you may just want typedef typename container::iterator iterator; James -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |