2013-11-01 47 views
16

我有一个快速排序,我在这里写下:错误:调用的对象类型“诠释”不是一个函数或函数指针

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. 

一切都看起来正确。任何人都可以帮我弄清楚什么是错的?

+5

你宣布'INT中旬mid功能;'但调用'中期(LO,喜)'...... – chris

回答

22

您的本地变量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)而不是重命名变量,但会迷惑你的程序的读者。

+0

+1。当然,重命名的替代方法是使用':: mid'来引用该函数。 – Angew

+0

谢谢!这有所帮助。我最初有一个叫做pivot的变量和pivot()函数,当我做了全局搜索和替换来尝试修复这个问题时,我忘了注意到这个变量也发生了变化。 – Pocketkid2

+0

@Angew感谢您的一个优秀点!我编辑了这个答案。 – dasblinkenlight

1
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)访问之前在全球范围内定义

相关问题