N
Neil Morgenstern
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:
stream & ostr ) =
0;
};
class Derived2 : public Abstract2
{
public:
void getme( const Abstract1 & abs1, std:
stream & ostr )
{
ostr << abs1.gimme();
}
};
using std::tr1::shared_ptr;
using std::tr1::bind;
using std::tr1:
laceholders::_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:
stringstream 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.
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:
0;
};
class Derived2 : public Abstract2
{
public:
void getme( const Abstract1 & abs1, std:
{
ostr << abs1.gimme();
}
};
using std::tr1::shared_ptr;
using std::tr1::bind;
using std::tr1:
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:
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.