$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Christian Larsen (contact_at_[hidden])
Date: 2008-08-18 11:40:15
Hi,
I'm storing function objects in a std::vector, but to remove one again,
I need to find an iterator to the one I want to remove. I do this in an
"unregister" function taking a single boost::function<void ()> as
parameter. Inside the function I would like to use the std::find
algorithm to get an iterator to that function in the vector. I'm getting
compile errors, though; see the example below. How do I fix these?
I'm using MSVC++ 8 (SP1), and Boost 1.33.1 (can not upgrade).
Example, where in my "unregister" function I use find as in the last
part of this example (i.e. I have a Listener and not a plain function
pointer). This does not compile:
     #include <algorithm>
     #include <vector>
     #include <boost/function.hpp>
     using namespace std;
     using namespace boost;
     void listenerA() {}
     void listenerB() {}
     int main()
     {
         typedef function<void ()> Listener;
         typedef vector<Listener> ListenerVector;
         ListenerVector listeners;
         listeners.push_back(&listenerA);
         listeners.push_back(&listenerB);
         ListenerVector::iterator iter;
         // This compiles and works
         iter = find(
             listeners.begin(), listeners.end(),
             &listenerB);
         assert(iter != listeners.end());
         // This gives:
         // error C2666: 'boost::operator ==' : 4 overloads have
         //     similar conversions
         iter = find(
             listeners.begin(), listeners.end(),
             Listener(&listenerB));
         assert(iter != listeners.end());
         return 0;
     }
Compiler errors:
c:\program files (x86)\microsoft visual studio 
8\vc\include\algorithm(40) : error C2666: 'boost::operator ==' : 4 
overloads have similar conversions
 
d:\development\boost_1_33_1\boost\function\function_template.hpp(583): 
could be 'void boost::operator ==<R,Allocator>(const 
boost::function0<R,Allocator> &,const boost::function0<R,Allocator> &)' 
[found using argument-dependent lookup]
         with
         [
             R=void,
             Allocator=std::allocator<void>
         ]
 
d:\development\boost_1_33_1\boost\function\function_base.hpp(609): or 
'bool boost::operator ==<boost::function<Signature>>(Functor,const 
boost::function_base &)' [found using argument-dependent lookup]
         with
         [
             Signature=void (void),
             Functor=boost::function<void (void)>
         ]
 
d:\development\boost_1_33_1\boost\function\function_base.hpp(600): or 
'bool boost::operator ==<_Ty>(const boost::function_base &,Functor)' 
[found using argument-dependent lookup]
         with
         [
             _Ty=boost::function<void (void)>,
             Functor=boost::function<void (void)>
         ]
         or 'built-in C++ operator==(void (__thiscall 
boost::function0<R,Allocator>::dummy::* )(void), void (__thiscall 
boost::function0<R,Allocator>::dummy::* )(void))'
         with
         [
             R=void,
             Allocator=std::allocator<void>
         ]
         while trying to match the argument list 
'(boost::function<Signature>, const boost::function<Signature>)'
         with
         [
             Signature=void (void)
         ]
         c:\program files (x86)\microsoft visual studio 
8\vc\include\algorithm(74) : see reference to function template 
instantiation '_InIt 
std::_Find<std::_Vector_iterator<_Ty,_Alloc>,_Ty>(_InIt,_InIt,const _Ty 
&)' being compiled
         with
         [
             _InIt=std::_Vector_iterator<Listener,std::allocator<Listener>>,
             _Ty=Listener,
             _Alloc=std::allocator<Listener>
         ]
         d:\development\misc\functionvector\functionvector.cpp(35) : see 
reference to function template instantiation '_InIt 
std::find<std::_Vector_iterator<_Ty,_Alloc>,boost::function<Signature>>(_InIt,_InIt,const 
_Ty &)' being compiled
         with
         [
             _InIt=std::_Vector_iterator<Listener,std::allocator<Listener>>,
             _Ty=Listener,
             _Alloc=std::allocator<Listener>,
             Signature=void (void)
         ]
Best regards,
Christian