$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Gustavo Ribeiro Alves (gralves_at_[hidden])
Date: 2006-03-12 20:06:23
Hello,
   I'm writing an small library to represent types. Right now I'm
focusing on representing type composition.
  For that I'm using the composite pattern as proposed by Gamma et
al., so I have an abstract base class for my composites that has the
virtual functions to addComposite members, but not their
implementation.
  The header of my class looks like this:
namespace dintype {
class Type{
        public:
                virtual ~Type()=0;
                typedef std::string Name_t;
                virtual void addComposition(const Name_t& name,Type* tp)=0;
                virtual void delComposition(const Name_t& name)=0;
                Type* clone() const;
        protected:
                typedef ptr_map<Name_t,Type>   children_t;
                typedef children_t::iterator            children_iterator;
                typedef children_t::const_iterator  children_const_iterator;
                typedef children_t::size_type         children_size_type;
                Type();		
        private:
                virtual Type* do_clone() const=0;
};
inline Type* new_clone(const Type& c) {
        return c.clone();
}
}
      The one for my composite class is:
class CompositeType : public Type
{
        private:
                children_t m_children;
                CompositeType(const CompositeType& r);
                virtual Type* do_clone();
        protected:
                void clearAllCompositeChildren();
        public:
                CompositeType();
                virtual ~CompositeType();
                virtual void addComposition(const Name_t& name,Type* tp);
                virtual void delComposition(const Name_t& name);
};
Here is the implementation of the composite class:
CompositeType::CompositeType(const CompositeType& r)
        : m_children(r.m_children.clone())
{
}
CompositeType::CompositeType()
{
}
CompositeType::~CompositeType()
{
}
void CompositeType::clearAllCompositeChildren() {
        m_children.erase(m_children.begin(),m_children.end());
}
void CompositeType::addComposition(const Name_t& name,Type* tp) {
        m_children[name]=tp;  // <========= THIS LINE IS THE PROBLEM
}
void CompositeType::delComposition(const Name_t& name) {
        m_children.erase(name);
}
I can't get the program to compile because gcc keeps complaining
m_children[name] don't has operator= and that type is an abstract
class and can't be initialized.
I read all the boost::prt_container documentation and I couldn't find
what I'm doing wrong. I also tried m_children.insert(name,tp); to no
avail.
I'll greatly appreciate any help.
Thanks,
Gustavo