错误:调用的对象类型“int”不是函数或函数指针

29

我这里写了一个快速排序算法:

void swap(int& a, int& b);
int mid(int lo, int hi);

// My quicksort implementation
void sort(int vec[], int lo, int hi)
{
        int mid;
        if (hi > lo) {
                int i = lo + 1;
                int j = hi;
                int p = mid(lo, hi);
                swap(vec[lo], vec[p]);
                mid = vec[lo];
                while (i < j) {
                        if (vec[i] <= mid) {
                                i++;
                        } else {
                                while (i < --j && vec[j] >= mid);
                                swap(vec[i], vec[j]);
                        }
                }
                i++;
                swap(vec[lo], vec[i]);
                sort(vec, lo, i);
                sort(vec, j, hi);
        }
}

void swap(int& a, int& b)
{
        int temp = a;
        a = b;
        b = temp;
}

int mid(int lo, int hi)
{
        return lo + ((hi - lo) / 2);
}

我尝试使用g++ -g -c array.cpp -o array.o将代码编译为目标文件,但出现了以下错误:

array.cpp:24:14: error: called object type 'int' is not a function or function
    pointer
            int p = mid(lo, hi);
                    ~~~^
1 error generated.

一切看起来都正确。有谁能帮我弄清楚问题出在哪里吗?


9
你声明了int mid;,但调用了mid(lo, hi)... - chris
在我的情况下,我没有在该行之前放置分号,因此我一直收到相同的错误。在我将分号放在前一个语句(即前一行)之后,问题得到了解决。 - Kozmotronik
3个回答

42

您的本地变量mid在更靠近使用点的范围内声明,因此它“掩盖”了mid()函数;编译器会认为您正在尝试“调用”一个整数,这是无效的。 更改本地变量名称以解决此问题:

int midpoint;
if (hi > lo) {
    int i = lo + 1;
    int j = hi;
    int p = mid(lo, hi);
    swap(vec[lo], vec[p]);
    midpoint = vec[lo];
    ...
}
注意:您也可以使用 ::mid(lo, hi),而无需重命名变量,但这会使您的程序读者感到困惑。

+1。当然,重命名的替代方案是使用 ::mid 来引用该函数。 - Angew is no longer proud of SO
谢谢!这很有帮助。我最初将变量称为pivot并将函数称为pivot(),当我进行全局搜索和替换以尝试解决问题时,我忘记注意到变量也发生了改变。 - Pocketkid2
@Angew 感谢你提出的精彩观点!我编辑了答案以加入这一点。 - Sergey Kalinichenko
@Pocketkid2 没问题!如果这个答案对你有用,请考虑接受它,让其他网站访问者知道你不再积极寻找更好的答案,并为自己赚取一些声望点数。 - Sergey Kalinichenko

3
int mid(int lo, int hi);      // here you declared mid as function and defined
                              // it later
// My quicksort implementation
void sort(int vec[], int lo, int hi)

{
int mid;                      // but here you declared mid as local variable
if (hi > lo) {                // it will shadow int mid(int lo, int hi);
        int i = lo + 1;
        int j = hi;
        int p = mid(lo, hi);  // so this is error, mid is integer not a function

您可以更改算法中变量的名称,或使用作用域解析运算符::mid(lo, hi)来访问先前在全局作用域中定义的mid函数。


-3
有时候当你的变量和函数同名时,就会出现这个错误。编译器无法理解这个名称是指函数还是变量;

1
编译器在函数作用域内准确知道 mid 的类型。错误信息明确指出 int 不是函数或函数指针。编译器并不会混淆。 - Blastfurnace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接