From: Daniel Krügler on
On 22 Mrz., 19:04, Jardel Weyrich <jweyr...(a)gmail.com> wrote:
> 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;

This needs to be:

typedef typename container::iterator iterator;

> };

Without any further context information the above
missing typename should be the only reason of
error. C++ requires the typename prefix here,
because container is a dependent type. And the
(rather simple) rule in C++ is that every dependent
name is assumed not to be a type. Of-course
container::iterator *is* a type, so you have
to attach the typename to make the compiler
happy.

HTH & Greetings from Bremen,

Daniel Kr�gler


--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]