【问题标题】:'boost::operator ==' : 4 overloads have similar conversions'boost::operator ==' : 4 个重载具有相似的转换
【发布时间】:2011-07-29 20:41:42
【问题描述】:

下面的代码给了我一个编译时错误。有人对如何解决此问题或可能导致此问题的原因有任何想法吗?

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

typedef boost::function<void (boost::weak_ptr<std::string>)> Callback;
std::list<Callback> callbacks;
Callback func;
callbacks.remove(func); // This causes the error 

【问题讨论】:

  • 即使你决定使用这个,你可能想要vector而不是list...
  • @Billy 我不知道回调可能会以什么顺序被删除,所以在这种情况下最好列出一个列表。
  • 在几乎所有现实世界的情况下,vector 仍然会因为缓存局部性和减少内存分配器的开销而获胜。 list 会变慢,除非它非常长(数万或数十万个元素)。
  • 哦,好的,谢谢你的信息。

标签: c++ boost compiler-errors


【解决方案1】:

当您调用std::list&lt;T&gt;::remove 时,它会通过将值与列表中的元素进行比较来查找要删除的值。对于 boost::function 对象,这将失败,因为无法比较 boost::function 对象。请参阅 Boost 函数常见问题解答中的 Why can't I compare boost::function objects with operator== or operator!=

您需要以其他方式从列表中删除对象(例如,使用 erase 和迭代器)。

在这种情况下,您似乎正在实现类似于 Boost.Signals 库的东西。您可能想改用它 - 它提供了一种注册多个回调并删除它们的方法。

【讨论】:

  • 谢谢。我环顾四周,发现this;我可以将它与remove_if 和Boost.Bind 一起使用。我还有什么理由继续使用 Boost.Signals?
  • @Paul:我不熟悉function_equal。根据文档,它只返回f == g - 我认为它实际上做的不止于此,否则它将毫无用处。
  • @interjay 考虑到,正如您所引用的,“boost::function 对象无法比较”,那么我认为 function_equal 非常有用,允许您实际比较 boost::function 对象。
  • @leetNightshade:除了它让你比较boost::function对象。它确实可以让您比较 Boost.Bind 对象,根据他的评论,这显然是 OP 所需要的。
  • @interjay 是的,经过进一步阅读,我很遗憾地意识到这一点,但找不到这个帖子来调整/删除我的评论。
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多