$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Christian Henning (chhenning_at_[hidden])
Date: 2007-05-20 22:30:16
Alright, I solved it. Two small changes in the code did it. Hope they
are not too bad for you.
First I needed to remove the =0 statement for the to_string in your
base class. If I don't do that I can the following error:
c:\boost_1_34_0\boost\tuple\detail\tuple_basic.hpp(328) : error C2259:
'Base' : cannot instantiate abstract class
[snip]
So my base class looks like as follows:
class Base {
public:
   virtual std::string to_String ( boost::uint32_t indent )
   { return "" ;}
};
Second change was to remove the boost::bind lib and to use lambda's
bind. I also needed to add an asterisk to _1.
Here is the complete code that works on my machine.
#include <string>
#include <sstream>
#include <boost/cstdint.hpp>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>
using namespace boost::lambda;
class Base {
public:
   virtual std::string to_String ( boost::uint32_t indent )
   { return "" ;}
};
class A : public Base {
public:
   A ( boost::uint32_t value )
       : m_value ( value )
   {}
   virtual std::string to_String ( boost::uint32_t indent )
   {
       std::stringstream output;
       for ( boost::uint32_t i = 0; i < indent; i++ )
           {
               output << " ";
           }
       output << m_value;
       return output.str();
   }
private:
   boost::uint32_t m_value;
};
class D : public Base {
public:
   D ( boost::uint32_t value )
       : m_value ( value )
   {}
   virtual std::string to_String ( boost::uint32_t indent )
   {
       std::stringstream output;
       for ( boost::uint32_t i = 0; i < indent; i++ )
           {
               output << " ";
           }
       output << m_value;
       return output.str();
   }
private:
   boost::uint32_t m_value;
};
const char* print( const std::string& s )
{
   return s.c_str();
}
int main ( int, char** )
{
   typedef boost::shared_ptr<A> A_ptr_t;
   typedef boost::shared_ptr<D> D_ptr_t;
   typedef std::vector < boost::shared_ptr<Base> > Data_t;
   Data_t m_data;
   A_ptr_t a ( new A ( 50 ) );
   D_ptr_t d ( new D ( 30 ) );
   m_data.push_back ( a );
   m_data.push_back ( d );
   boost::uint32_t indent_value = 4;
   std::for_each ( m_data.begin(),
                   m_data.end(),
                   std::cout << bind( &Base::to_String,
                                              *_1,
                                              indent_value ) );
   return 0;
}
Regards,
Christian