【问题标题】:Called object type 'int' is not a function or function pointer被调用的对象类型“int”不是函数或函数指针
【发布时间】:2021-11-21 04:44:25
【问题描述】:

我对C++有点陌生,因此,我不知道这个错误的原因是什么,我试图递归解决edit distance问题,但是,这个错误出现了。

错误:调用的对象类型“int”不是函数或函数指针 返回 __comp(__b, __a) ? __b : __a;

    #include <iostream>
#include <string>
#include <vector>

using namespace std;

int distance(string, string, int, int);
int cost(string, string, int, int);
int main(){
    string v = "love";
    string v2 = "hate";
    cout<<distance(v, v2, v.size()-1, v2.size()-1);

    
}

int distance(string v, string v2, int a, int b)
{
    if (a==0) return b;
    if (b==0) return a;

    return min(
        distance(v, v2, a, b-1)+1,
        distance(v, v2,  a-1, b)+1,
        distance(v, v2, a-1, b-1)+cost(v, v2, a, b));

}
int cost(string v, string v1, int a, int b)
{
    if (v[a]==v1[b]) return 0;
    return 1;
}

【问题讨论】:

  • std::min(a, b, c) -> std::min({a, b, c}).
  • 顺便说一句,如果你要使用std::min(...),也不要忘记包含&lt;algorithm&gt;
  • 我建议写using std::min; 而不是using namespace std;。另见Why is "using namespace std;" considered bad practice?
  • [OT]:通过 const 引用而不是通过值传递(未修改的)字符串,以避免不必要的副本。
  • 通过猜测语言规则进行编程并不是一个好主意。为什么你认为min(a, b, c) 应该有效?

标签: c++ algorithm debugging edit-distance


【解决方案1】:

std::min 的第三个参数是比较器,您可能更喜欢采用 initializer_list 的重载:

return min({
        distance(v, v2, a, b - 1) + 1,
        distance(v, v2,  a - 1, b) + 1,
        distance(v, v2, a - 1, b - 1) + cost(v, v2, a, b)});

【讨论】:

  • 或拨打 min 两次:return min(distance(v, v2, a, b-1)+1, min(distance(v, v2, a-1, b)+1, distance(v, v2, a - 1, b - 1) + cost(v, v2, a, b)))
  • @Stef:IMO 不太清楚,所以除非 OP 必须在 C++11 之前工作,否则我不会使用它。
猜你喜欢
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多