$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Pete Hodgson (spam_at_[hidden])
Date: 2006-07-04 13:55:58
Hi All,
I'm just getting into using boost and stl algorithms, and I'm getting 
some indecipherable compiler errors that I'd like some help understanding.
Here's some sample code:
<------------------------SNIP------------------------>
#include <boost/shared_ptr.hpp>
#include <boost/functional.hpp>
#include <boost/bind.hpp>
class CEgg
{
public:
        bool IsHatched() const;
};
typedef std::vector< boost::shared_ptr<CEgg> > tEggsVector;
//this function compiles with no problems
bool SomeEggsHaveHatched()
{
        tEggsVector basketOfEggs;
        tEggsVector::const_iterator it = std::find_if(
                basketOfEggs.begin(),
                basketOfEggs.end(),
                boost::mem_fn( &CEgg::IsHatched ) );
        bool bSomeEggsHaveHatched = ( it != basketOfEggs.end() );
        return bSomeEggsHaveHatched;
}
//this function doesn't compile,
//presumably because of the boost::not1 usage
bool AllEggsHaveHatched()
{
        tEggsVector basketOfEggs;
        tEggsVector::iterator it = std::find_if(
                basketOfEggs.begin(),
                basketOfEggs.end(),
                boost::not1( boost::mem_fn( &CEgg::IsHatched ) ) );
        bool bSomeEggsHaventHatched = ( it != basketOfEggs.end() );
        return !bSomeEggsHaventHatched;
}
<------------------------SNIP------------------------>
When I try and compile this in Visual C++ 2003 I get the following 
compile errors for AllEggsHaveHatched():
c:\Program Files\Microsoft Visual Studio .NET 
2003\Vc7\include\algorithm(64) : error C2664: 'bool 
boost::unary_negate<Predicate>::operator ()(const 
boost::call_traits<T>::param_type) const' : cannot convert parameter 1 
from 'std::allocator<_Ty>::value_type' to 'const 
boost::call_traits<T>::param_type'
         with
         [
             Predicate=boost::_mfi::cmf0<bool,CEgg>,
 
T=boost::unary_traits<boost::_mfi::cmf0<bool,CEgg>>::argument_type
         ]
         and
         [
             _Ty=boost::shared_ptr<CEgg>
         ]
         and
         [
 
T=boost::unary_traits<boost::_mfi::cmf0<bool,CEgg>>::argument_type
         ]
         No user-defined-conversion operator available that can perform 
this conversion, or the operator cannot be called
         c:\WORK\4DCapture_Soln\VideoCapture\PixelinkCaptureFacade.h(46) 
: see reference to function template instantiation '_InIt 
std::find_if<std::vector<_Ty>::iterator,boost::unary_negate<Predicate>>(_InIt,_InIt,_Pr)' 
being compiled
         with
         [
             _InIt=std::vector<boost::shared_ptr<CEgg>>::iterator,
             _Ty=boost::shared_ptr<CEgg>,
             Predicate=boost::_mfi::cmf0<bool,CEgg>,
             _Pr=boost::unary_negate<boost::_mfi::cmf0<bool,CEgg>>
         ]
Any idea why boost::not1 seems to be causing problems? Should I be using 
std::not1? or boost::mem_fun instead of boost:mem_fn?
Cheers and TIA,
Pete