Pregunta

he siguiente código en 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;
}

Tengo un problema

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"

ayuda por favor

¿Fue útil?

Solución

swap es una función en std que debe ser incluido por <iostream>. Al intentar realizar llamadas a su swap, no puede encontrarlo (lo explicaré en un momento) y en su lugar se ve en la std::sort, que toma dos argumentos (de ahí el primer error).

La razón por la que no puede encontrar su swap es porque se ha declarado después de que se llama. Es necesario mover ni en la definición de su swap por encima de la de qsort5 o hacia adelante declare que:

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

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

Esto le dice al compilador que existe su función de intercambio y la usará cuando llame swap con 3 argumentos.

Otros consejos

Se tiene que declarar su versión de swap antes de usarla. Dado que el compilador no vio una declaración, que utiliza la encontró en el espacio de nombres std. También, escrito mal qsort5 (omitiendo la 5 en la última línea de la función). Una vez más, el compilador encuentra una función con ese nombre (pero una firma diferente) en std y se quejó.

Debe moverse ya sea toda la definición de swap a una posición antes de qsort5 función o insertar una declaración

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

antes qsort5.

No utilice using namespace std;, es generalmente una mala práctica. esto trae std :: intercambio en alcance, selecciones de modo compilador hasta que swap, en lugar de los suyos (ya que el suyo no se define en absoluto este punto).

Mover definición de su canje antes de usarla.

Parece que faltan un aparato ortopédico:

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

En el bucle anteriormente, j se establece en cero un manojo entero de veces. Esto puede ser simplificada (por usted y será por el compilador) a:

j = 0;

De lo contrario hay un conjunto que falta de apoyos o algo más.

A no ser que se trata de un ejercicio, ¿ha considerado el uso de std::sort en lugar de reinventar la rueda? Entonces su error desaparece porque la función qsort5 se puede quitar.

Usted está esperando su función de intercambio (int, int, int) para ser llamado. Sin embargo, si nos fijamos en el error, se menciona 'std :: swap de vacío (...)'. Esto se debe a que está using namespace std, y su función de intercambio se declara a continuación qsort5.

Así que parece para una función de intercambio, y sólo puede ver std: intercambio. Trate de poner su función de intercambio por encima de qsort5 por lo que puede ver que uno también.

¿Usted tal vez la intención de llamar qsort5 al final, y llamar qsort lugar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top