Thanks for the help. Roman's idea of using std::string constructor is better than a handcrafted loop. I just got my mind into a trap thinking I had to create a loop. I don't see the need to change the base class to_String to a function. My intention is to leave it as it is since vc8 and gcc both compile it fine. Stephen On Sun, 2007-05-20 at 22:30 -0400, Christian Henning wrote:
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
#include <vector> #include #include #include #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 _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users