簡體   English   中英

沒有用於調用 Class::Method 的匹配函數

[英]no matching function for call to Class::Method

嘗試實現優先搜索樹時,嘗試構建樹時出現此錯誤

錯誤:沒有匹配的函數調用 'ArbolP::crearArbol(ArrRazon*&, int, int&)

注意:候選人:'void ArbolP::crearArbol(ArbolP::ArrRazon*, int, int)'

另外,我可以使用 PST 的一些幫助

.h ArbolP 文件

#define ARBOLP_H
#include <Empresa.h>


class ArbolP
{

    public:
        struct ArrRazon {
            int posicion;
            int empleados;
        };

         struct Arbol{
            ArrRazon razon;
            float mediana;
            Arbol *izq;
            Arbol *der;
        };

        ArbolP();
        virtual ~ArbolP();
        ArbolP::Arbol * crearNodo(ArrRazon razon, Arbol * izq, Arbol * der, float mediana);
        int posicionEnRanking(ArrRazon *arreglo, int inicio, int tamanio_arreglo);
        float calcular_mediana(ArrRazon *arreglo, int tamanio_arreglo, int pos);
        void crearArbol(ArrRazon *arreglo, int inicio, int tamanio_arreglo);

    private:

        Arbol *raiz;


};

#endif // ARBOLP_H

ArbolP.cpp 文件


ArbolP::ArbolP()
{
    //ctor
    raiz = NULL;
}

void moverInicio(ArbolP::ArrRazon *arreglo, int inicio, int menorP){
    ArbolP::ArrRazon aux = arreglo[inicio];
    arreglo[inicio] = arreglo[menorP];
    arreglo[menorP] = aux;
}

int posicionMediana(ArbolP::ArrRazon *arreglo, int inicio, int fin, float mediana){
    while (inicio<fin){
        if (arreglo[inicio].empleados >= mediana)
            return inicio;
        inicio++;
    }
    return -1;
}

ArbolP::Arbol * crearNodo(ArbolP::ArrRazon razon, ArbolP::Arbol * izq, ArbolP::Arbol * der, float mediana){
    ArbolP::Arbol * nodo = new ArbolP::Arbol;
    nodo->razon = razon;
    nodo->izq = izq;
    nodo->der = der;
    nodo->mediana = mediana;
    return nodo;
}

void crearDuplicado(ArbolP::ArrRazon *arreglo, ArbolP::ArrRazon *aux, int tamanio_arreglo){
    for (int i=0; i<tamanio_arreglo; i++)
        aux[i] = arreglo[i];
}

ArbolP::Arbol *construirArbol(ArbolP::ArrRazon  *arreglo, int inicio, int fin){
    if (inicio > fin)
        return NULL;

    int empresaMenorP = posicionEnRanking(arreglo, inicio, fin);

    moverInicio(arreglo, inicio, empresaMenorP);

    float mediana = -1;

    int nuevoInicio = inicio+1;

    ArbolP::Arbol * ramaIzq = NULL;
    ArbolP::Arbol * ramaDer = NULL;

    if (inicio < fin){
        mediana = calcular_mediana(arreglo, fin, nuevoInicio);

        int posicionMIzq = posicionMediana(arreglo, nuevoInicio, fin, mediana);

        if (posicionMIzq != -1){
            ramaIzq = construirArbol(arreglo, nuevoInicio, posicionMIzq);
            ramaDer = construirArbol(arreglo, posicionMIzq+1, fin);
        } else{
            ramaDer = construirArbol(arreglo, nuevoInicio, fin);
        }
    }

    ArbolP::Arbol *nuevoNodo = crearNodo(arreglo[inicio], ramaIzq, ramaDer, mediana);

    return nuevoNodo;

}

void ArbolP::crearArbol(ArrRazon *arreglo, int inicio, int tamanio_arreglo)
{
    ArrRazon arregloE[tamanio_arreglo];
    crearDuplicado(arreglo, arregloE, tamanio_arreglo);

    mergeSortE(arregloE, inicio, tamanio_arreglo);

    raiz = construirArbol(arregloE, inicio, tamanio_arreglo-1);
}

ArbolP::~ArbolP()
{
    //dtor
}

主文件

struct ArrRazon {
    int posicion;
    int empleados;
    string razonsocial;
};
struct ArregloServicio {
            int posicion;
            int empleados;
        };

int main()
{   int l=0;
    int tamanio_arreglo;//El entero tamanio_arreglo se usa como condicion de corte en los servicios
    Empresa* arreglo = procesar_archivo_entrada("ranking_empresas.csv",tamanio_arreglo);
    ArrRazon* ArregloRazon = new ArrRazon[tamanio_arreglo];
    ArbolP nuevo;
    nuevo.crearArbol(ArregloRazon, 0, tamanio_arreglo);
    delete [] arreglo;
    delete [] ArregloRazon;
    return 0;

}

您似乎想使用字符串成員擴展類ArbolP::ArrRazon 您應該繼承該類,而不是在主文件中重寫它。

struct ArrRazon : public ArbolP::ArrRazon {
    string razonsocial;
};

ArrRazon arregloE[tamanio_arreglo]; 不是 VLA 的標准 C++ 支持。

crearDuplicado不適用於此類設計。 它無法處理ArbolP::ArrRazon子類。

在這個成員函數聲明中

void crearArbol(ArrRazon *arreglo, int inicio, int tamanio_arreglo);

類型說明符 ArrRazon 指的是類 ArbolP 的成員。

class ArbolP
{

    public:
        struct ArrRazon {
            int posicion;
            int empleados;
        };
        //...
        void crearArbol(ArrRazon *arreglo, int inicio, int tamanio_arreglo);
};

但是,在帶有 main 的模塊中,您在全局命名空間中聲明了一個同名的結構,並且您嘗試使用此新類型說明符的對象調用成員函數

struct ArrRazon {
    int posicion;
    int empleados;
    string razonsocial;
};
struct ArregloServicio {
            int posicion;
            int empleados;
        };

int main()
{   int l=0;
    int tamanio_arreglo;//El entero tamanio_arreglo se usa como condicion de corte en los servicios
    Empresa* arreglo = procesar_archivo_entrada("ranking_empresas.csv",tamanio_arreglo);
    ArrRazon* ArregloRazon = new ArrRazon[tamanio_arreglo];
    ArbolP nuevo;
    nuevo.crearArbol(ArregloRazon, 0, tamanio_arreglo);
    //...

所以編譯器會報錯,因為ArbolP::ArrRazon::ArrRazon是兩種不同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM