Re: Using std container to hold boost::shared_ptr with template parameter
On 22 Mrz., 19:04, Jardel Weyrich <jweyr...@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! ]