$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2008-06-13 01:49:04
Christopher Harvey skrev:
> This is a pretty simple question, so I'll just go ahead and paste the 
> test case i wrote. The compile errors are right below it.
> 
> (boost version: 1.34.1-r2)
> 
> #include <utility>
> #include <boost/ptr_container/ptr_map.hpp>
> 
> class Filter
> {
> public:
>  virtual void blah() const = 0;
> };
> 
> class SpecificFilter : public Filter
> {
> public:
> 
>  SpecificFilter() : Filter() {}
>  void blah() const
>  {
>     }
> };
> 
> int main()
> {
>  boost::ptr_map<unsigned char, Filter> map;
>  map[0].blah();
> }
> /usr/include/boost/ptr_container/ptr_map_adapter.hpp:168: error: cannot 
> allocate an object of abstract type 'Filter'
> main.cc:5: note:   because the following virtual functions are pure 
> within 'Filter':
> main.cc:7: note:     virtual void Filter::blah() const
> 
> I'm surprised it's not happy about the fact that blah is pure virtual 
> because this is a pointer container so I thought that wouldn't be a 
> problem.
No matter what, then you can't create an object of abstract type.
operator[]() needs to create a default argument.
> Side note:
> What happens when I try to access an element that doesn't exist, and 
> what happens when I insert two elements with the same key?
with operator[](), a default constructed element is inserted. With 
at(key), an exception is thrown.
As for double insertions, then the same happens as in a normal map.
-Thorsten