
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