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

问题描述 投票:0回答:4

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

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.

一切看起来都正确。谁能帮我找出问题所在吗?

c++ quicksort
4个回答
43
投票

您的局部变量

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)
而不是重命名变量,但这会让程序的读者感到困惑。


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
函数


0
投票

在我的例子中,我已将变量名称声明为“min”,这是 C++ 中的关键字,因此只需重命名与任何内置函数不同的关键字即可。

在我的例子中,我已将变量名称更改为 minNum,因为 min 与 min() 内置 C++ 函数冲突。

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int minK, int maxK) {
        int count = 0;

        for(int i=0; i<nums.size(); i++) {
            for(int j=i; j<nums.size(); j++) {
                int minNum = INT_MAX;
                int maxNum = INT_MIN;
                for(int K=i; K<=j; K++) {
                    minNum = min(nums[K], minNum);
                    maxNum = max(nums[K], maxNum);
                }

                if(minNum == minK && maxNum == maxK) count++;
            }
        }

        return count;
    }
};

https://leetcode.com/problems/count-subarrays-with-fixed-bounds/


-3
投票

有时当你有一个变量和函数相同的命名时,它会给出这个错误。编译器无法理解这个名称指的是函数还是变量;

© www.soinside.com 2019 - 2024. All rights reserved.