$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Rennie deGraaf (renniedegraaf_at_[hidden])
Date: 2007-05-04 19:51:39
Hello,
Could anyone please tell me why the following code fails to compile:
> inline void rmfunc(std::list<boost::function<void()> >& funcs, boost::function<void()> f)
> {
>     for (std::list<boost::function<void()> >::iterator i=funcs.begin(); i!=funcs.end(); ++i)
>     {
>         if (boost::function_equal(*i, *f))
>             i = funcs.erase(i);
>     }
> }
while the following does compile:
> template <typename T>
> inline void rmfunc(std::list<boost::function<void()> >& funcs, const T& f)
> {
>     for (std::list<boost::function<void()> >::iterator i=funcs.begin(); i!=funcs.end(); ++i)
>     {
>         if (boost::function_equal(*i, f))
>             i = funcs.erase(i);
>     }
> }
and seemingly equivalent code, placed in-line in the calling function,
also compiles?
> for (std::list<boost::function<void()> >::iterator i=funcs.begin(); i!=funcs.end(); ++i)
> {
>     if (boost::function_equal(*i, boost::ref(bar)))
>         i = funcs.erase(i);
> }
The full code for my test program (with the non-compiling function
commented out) is attached.  My compiler is gcc 4.1.1; I'm using the
boost 1.33.1 package from Fedora Core 5.
Thanks,
Rennie deGraaf
#include <list>
#include <algorithm>
#include <boost/ref.hpp>
#include <boost/function.hpp>
#include <iostream>
struct Foo
{
    void operator()()
    {}
};
/*inline void rmfunc(std::list<boost::function<void()> >& funcs,
boost::function<void()> f)
{
    for (std::list<boost::function<void()> >::iterator i=funcs.begin();
i!=funcs.end(); ++i)
    {
        if (boost::function_equal(*i, f))
            i = funcs.erase(i);
    }
}*/
template <typename T>
inline void rmfunc(std::list<boost::function<void()> >& funcs, const T& f)
{
    for (std::list<boost::function<void()> >::iterator i=funcs.begin();
i!=funcs.end(); ++i)
    {
        if (boost::function_equal(*i, f))
            i = funcs.erase(i);
    }
}
int main()
{
    std::list<boost::function<void()> > funcs;
    Foo foo;
    Foo bar;
    funcs.push_back(boost::ref(foo));
    funcs.push_back(boost::ref(bar));
    std::cout << funcs.size() << std::endl; // should be 2
    rmfunc(funcs, boost::ref(foo));
    std::cout << funcs.size() << std::endl; // should be 1
    for (std::list<boost::function<void()> >::iterator i=funcs.begin();
i!=funcs.end(); ++i)
    {
        if (boost::function_equal(*i, boost::ref(bar)))
            i = funcs.erase(i);
    }
    std::cout << funcs.size() << std::endl; // should be 0
    return 0;
}