[英]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.