C++ ';boost::operator==';:4重载具有类似的转换

C++ ';boost::operator==';:4重载具有类似的转换,c++,boost,compiler-errors,C++,Boost,Compiler Errors,下面的代码给了我一个编译时错误。有没有人知道如何解决这个问题,或者是什么原因造成的 'boost::operator=':4个重载具有类似的转换 typedef boost::函数回调; std::列表回调; 回调函数; 回调。删除(func);//这会导致错误 当您调用std::list::remove时,它通过与列表中的元素进行比较来查找要删除的值。对于boost::function对象,这会失败,因为无法比较boost::function对象。请参阅Boost函数常见问题解答中的 您需要以

下面的代码给了我一个编译时错误。有没有人知道如何解决这个问题,或者是什么原因造成的

'boost::operator=':4个重载具有类似的转换

typedef boost::函数回调;
std::列表回调;
回调函数;
回调。删除(func);//这会导致错误

当您调用
std::list::remove
时,它通过与列表中的元素进行比较来查找要删除的值。对于
boost::function
对象,这会失败,因为无法比较
boost::function
对象。请参阅Boost函数常见问题解答中的

您需要以另一种方式(例如使用
erase
和迭代器)从列表中删除对象


在本例中,看起来您正在实现类似于库的东西。您可能想改用它-它提供了一种注册多个回调并将其删除的方法。

即使您决定使用此方法,您也可能希望使用
vector
,而不是
list
。@Billy我不知道回调的删除顺序,因此在这种情况下,列表更好。在几乎所有现实情况下,
vector
由于缓存位置和减少内存分配器的开销,仍然获胜<代码>列表将变慢,除非它非常长(几十或几十万个元素)。哦,好的,谢谢你提供的信息。谢谢。我环顾四周,发现;我可以和Boost.Bind一起使用。有什么理由让我继续使用Boost.Signals吗?@Paul:我不熟悉
函数_equal
。根据文献,它只返回<代码> f==g< /代码> -我假设它实际上比它做的更多,或者它将是非常无用的。@ Injayy考虑到,正如你所说的,“Boo::函数对象不能被比较”,然后我认为函数等同于非常有用。允许您实际比较boost::function对象。@leetNightshade:除了它不允许您比较
boost::function
对象之外。它确实可以让你比较Boost.Bind对象,根据OP的评论,这显然是OP需要的。@interjay是的,在进一步阅读后,我悲伤地意识到了这一点,但找不到这个线程来调整/删除我的评论。
typedef boost::function<void (boost::weak_ptr<std::string>)> Callback;
std::list<Callback> callbacks;
Callback func;
callbacks.remove(func); // This causes the error