1

我在 C++ 中有以下代码

#include <iostream>
using namespace std;

void qsort5(int a[],int n){
    int i;
    int j;
    if (n<=1)
        return;
    for (i=1;i<n;i++)
        j=0;
    if (a[i]<a[0])
        swap(++j,i,a);
    swap(0,j,a);
    qsort5(a,j);
    qsort(a+j+1,n-j-1);
}

int main()
{
    return 0;
}

void swap(int i,int j,int a[])
{
    int t=a[i];
    a[i]=a[j];
    a[j]=t;
}

我有问题

1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(16) : error C2661: 'qsort' : no overloaded function takes 2 arguments
1>Build log was saved at "file://c:\Users\dato\Documents\Visual Studio 2008\Projects\qsort5\qsort5\Debug\BuildLog.htm"

请帮忙

4

7 回答 7

5

swap您必须在使用之前声明您的版本。由于编译器没有看到声明,它使用了它在std命名空间中找到的声明。此外,您拼写错误qsort5(省略了函数最后一行中的 5)。同样,编译器在其中发现了一个具有该名称(但签名不同)的函数std并抱怨。

您应该将整个定义移动swap到函数之前的位置qsort5或插入声明

void swap(int i,int j,int a[]);

之前qsort5

于 2010-06-10T18:41:37.273 回答
4

swap是一个std必须包含在其中的函数<iostream>。当您尝试调用您的swap时,它找不到它(我稍后会解释),而是查看带有std::sort两个参数的 (因此出现第一个错误)。

它找不到你的原因swap是因为它是在调用后声明的。您需要将您的定义移到 ofswap之上qsort5或向前声明它:

void swap(int i,int j,int a[]);

void qsort5(int a[],int n){ 
  ...

这告诉编译器您的交换函数存在,并且当您swap使用 3 个参数调用时它将使用它。

于 2010-06-10T18:43:46.340 回答
1

不要使用using namespace std;,通常是不好的做法。这会将 std::swap 带入范围,因此编译器会选择该交换,而不是您的交换(因为此时尚未定义您的交换)。

在使用交换之前移动它的定义。

于 2010-06-10T18:43:26.703 回答
1

看起来你缺少一个大括号:

for (i=1;i<n;i++)
    j=0;

在上面的循环中,j很多次都设置为零。这可以(由您并将由编译器)简化为:

j = 0;

否则会缺少一组大括号或其他东西。

于 2010-06-10T19:06:14.077 回答
1

除非这是一个练习,否则您是否考虑过使用std::sort而不是重新发明轮子?然后您的错误消失了,因为qsort5可以删除该功能。

于 2010-06-10T20:19:49.390 回答
0

您期望调用您的 swap(int,int,int) 函数。但是,如果您查看错误,它会提到“void std::swap(...)”。这是因为您是using namespace std,并且您的交换函数在 qsort5 下声明。

所以它寻找一个交换函数,并且只能看到std:swap。试着把你的交换函数放在 qsort5 上面,这样它也可以看到那个。

于 2010-06-10T18:42:03.930 回答
0

您是否打算在最后调用 qsort5 并改为调用 qsort?

于 2010-06-10T19:20:04.273 回答