From: Jardel Weyrich on
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
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
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! ]