【问题标题】:find_if in set in C++: unresolved overloaded function typefind_if in set in C++:未解析的重载函数类型
【发布时间】:2013-03-06 04:34:41
【问题描述】:

我之前在 C++ 中将 find_if 用于列表和向量,它运行良好。但是现在,当我尝试将它与集合一起使用时,我收到以下错误:

 error: no matching function for call to ‘find_if(std::set<A, Acmp>::iterator, 
 std::set<A, Acmp>::iterator, <unresolved overloaded function type>)’|

我的班级如下:

bool searchForA(A i) {
   return (i.getVal() > 0);
 }


void B::findA()
 {
   set<A, Acmp> cont;
   set<A, Acmp>::iterator it;
   A *a1 = new A(5);
   A *a2 = new A(7);
   cont.insert(*a1);
   cont.insert(*a2);

   it = find_if (cont.begin(), cont.end(), search)
}

谁能帮我理解问题出在哪里?

【问题讨论】:

  • 不,我没有将它包含在集合的 A 类中。如果我可能会问,为什么重载
  • 声明search (A const &amp;i)怎么样
  • 这是泄漏内存的好方法。指针完全没有必要。顺便说一句,this 很接近并且有效。
  • set 元素需要弱排序,尝试添加 operator&lt; 你的代码应该可以编译,正如 chris 提到的,你的代码泄漏内存
  • 您在上面给出的search() 函数的定义是否与您的代码中的完全相同?它是该函数的唯一定义,还是有任何重载?

标签: c++ set stdset


【解决方案1】:

STL 中已经有一个名为search 的函数。这可能就是编译器在没有更好提示的情况下无法解析正确名称的原因。您可以重命名搜索功能。或者,如果您不想这样做,请尝试将 ::search 传递给 find_if

【讨论】:

  • 我最初也是这么想的。我试图更改函数的名称。还是一样的错误。
  • 不,更改函数的名称确实可以解决该错误。你又遇到了一个大错误,因为 A 需要一个比较运算符,就像其他人说的那样。
  • 是的,更改名称解决了问题。
【解决方案2】:

有不止一个函数名为search — 名称被重载。要将指向search 的指针传递给find_if,您需要指定哪一个。最直接的方法是指定static_cast&lt; bool (*)( A ) &gt;( cont )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多