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