繁体   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