What is wrong here? It looks fine to me
Reproduced sample of the kind of thing I am trying to do. This fails
with VC2008, I'm not sure if it's an error in the code or in the
VC2008 library. I tried Comeau tryitout and it didn't recognise the
tr1 parts even though I am including all of the relevant headers so no
help there, unfortunately.
#include <memory>
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
#include <sstream>
class Abstract1
{
public:
virtual ~Abstract1()
{
}
virtual std::string gimme() const = 0;
};
class Derived1 : public Abstract1
{
std::string gimme() const
{
return "Take It\n";
}
};
class Abstract2
{
public:
virtual ~Abstract2()
{
}
virtual void getme( const Abstract1 & abs1, std::ostream & ostr ) =
0;
};
class Derived2 : public Abstract2
{
public:
void getme( const Abstract1 & abs1, std::ostream & ostr )
{
ostr << abs1.gimme();
}
};
using std::tr1::shared_ptr;
using std::tr1::bind;
using std::tr1::placeholders::_1;
using std::tr1::ref;
using std::tr1::cref;
int main()
{
shared_ptr< Abstract1 > ptr1( new Derived1 );
typedef shared_ptr< Abstract2 > Ptr2;
std::vector< Ptr2 > ptr2Vec;
ptr2Vec.push_back( Ptr2( new Derived2 ) );
std::ostringstream oss;
std::for_each( ptr2Vec.begin(), ptr2Vec.end(),
bind( &Abstract2::getme, _1, cref( *ptr1 ), ref( oss ) ) );
std::cout << oss.str();
}
The error messages I am getting relate to Abstract1 being abstract (it
doesn't have a problem with Abstract2) even though I am clearly
passing the 3rd parameter in bind with the cref() modifier so it
should be passing through just a const reference.
In my real code I have had to workaround with a home-made functor.
Took me a few seconds to write that, but I'd rather use bind than have
to write functors.