如何解决以下错误,谢谢。
[错误]未在此作用域中声明"IntercDirectoIzq">
[Error]应在">"之前使用主表达式代币
[错误]未在此范围中声明"Orden">
[Error]不匹配'operator<lt;'(操作数类型为"std::ostream{aka std::basic_stream}"one_answers"Alumino"(
铝cpp
#include "Alumno.h"
#include "Arreglo.h"
#include "MetOrdena.h"
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
Arreglo<Alumno> Escuela;
Escuela.Lectura();
IntercDirectoIzq<Alumno> Orden;
Orden.Ordena(&Escuela);
Escuela.Escribe();
if (Escuela.RegresaTam() != 0)
cout<<"Los datos del primer alumno son:"<<endl;
cout<< Escuela.RegresaValor(0);
return 0;
}
Alumino.h
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
class Alumno {
private:
int Clave;
char Nombre[64];
public:
Alumno();
Alumno(int, char *);
int operator > (Alumno);
friend istream &operator >> (istream &, Alumno &);
friend ostream &operator << (ostream &, Alumno &);
};
Alumno::Alumno()
{}
Alumno::Alumno(int Cla, char Nom[])
{
Clave= Cla;
strcpy(Nombre, Nom);
}
int Alumno::operator > (Alumno ObjAl)
{
if (Clave > ObjAl.Clave)
return 1;
else
return 0;
}
istream &operator >> (istream &Lee, Alumno &ObjAl)
{
cout<<"nnIngrese clave del alumno: ";
Lee>>ObjAl.Clave;
cout<<"nnIngrese nombre del alumno: ";
Lee>>ObjAl.Nombre;
return Lee;
}
ostream &operator << (ostream &Escribe, Alumno &ObjAl)
{
Escribe<<"nnDatos del alumnon";
Escribe<<"nClave: "<<ObjAl.Clave;
Escribe<<"nNombre: "<<ObjAl.Nombre<<"n";
return Escribe;
}
Arreglo.h
#include<iostream>
#include<stdio.h>
#define MAX 100
using namespace std;
template <class T>
class Arreglo
{
private:
T Datos[MAX];
int Tam;
public:
Arreglo();
int RegresaTam();
T RegresaValor(int);
void AsignaValor(int, T);
void Lectura();
void Escribe();
};
template <class T>
Arreglo<T>::Arreglo()
{
Tam= 0;
}
template <class T>
int Arreglo<T>::RegresaTam()
{
return Tam;
}
template <class T>
T Arreglo<T>::RegresaValor(int Indice)
{
return Datos[Indice];
}
template <class T>
void Arreglo<T>::AsignaValor(int Indice, T Valor)
{
Datos[Indice]= Valor;
}
template <class T>
void Arreglo<T>::Lectura()
{
int Indice;
do {
cout<<"nn Ingrese total de elementos: ";
cin>> Tam;
} while (Tam < 1 || Tam > MAX);
for (Indice= 0; Indice < Tam; Indice++)
{
cout<<"nIngrese el "<<Indice + 1<<" dato: ";
cin>> Datos[Indice];
}
}
template <class T>
void Arreglo<T>::Escribe()
{
int Indice;
if (Tam > 0)
{
cout<<"nn";
for (Indice= 0; Indice < Tam; Indice++)
cout<< "t" << Datos[Indice];
cout<<"nn";
}
else
cout<< "n No hay elementos almacenados.";
}
MetOrdena.h
#define MAX 100
template <class T>
class Arreglos
{
//private:
public:
T Datos[MAX];
int Tam;
Arreglos();
int RegresaTam();
T RegresaValor(int);
void AsignaValor(int, T);
void Intercambia(int, int);
void IntercDirectoIzq();
void InsercionDirecta();
void SeleccionDirecta();
void QuickSort();
void Reduce(int, int);
void Lectura();
void Escribe();
};
template <class T>
Arreglos<T>::Arreglos()
{
Tam=0;
}
template <class T>
void Arreglos<T>::Intercambia(int Ind1, int Ind2)
{
T Auxiliar;
Auxiliar= Datos[Ind1];
Datos[Ind1]= Datos[Ind2];
Datos[Ind2]= Auxiliar;
}
template <class T>
void Arreglos<T>::IntercDirectoIzq()
{
int Ind1, Ind2;
for (Ind1= 1; Ind1< Tam; Ind1++)
for (Ind2= Tam-1; Ind2 >= Ind1; Ind2--)
if (Datos[Ind2-1] > Datos[Ind2])
Intercambia(Ind2-1, Ind2);
}
template <class T>
void Arreglos<T>::InsercionDirecta()
{
int Auxiliar, Indice, IndAux;
for (Indice= 1; Indice < Tam; Indice++)
{
Auxiliar= Datos[Indice];
IndAux= Indice - 1;
while ((IndAux >= 0) && (Auxiliar < Datos[IndAux]))
{
Datos[IndAux+1]= Datos[IndAux];
IndAux--;
}
Datos[IndAux+1]= Auxiliar;
}
}
template <class T>
void Arreglos<T>::SeleccionDirecta()
{
int Menor, Ind1, Ind2, Ind3;
for (Ind1= 0; Ind1 < Tam-1; Ind1++)
{
Menor= Datos[Ind1];
Ind2= Ind1;
for (Ind3= Ind1+1; Ind3 < Tam; Ind3++)
if (Datos[Ind3] < Menor)
{
Menor= Datos[Ind3];
Ind2= Ind3;
}
Datos[Ind2]= Datos[Ind1];
Datos[Ind1]= Menor;
}
}
template <class T>
void Arreglos<T>::QuickSort()
{
Reduce(0, Tam-1);
}
template <class T>
void Arreglos<T>::Reduce(int Inicio, int Fin)
{
if ( Tam > 0)
{
int Izq, Der, Posic, Bandera;
Izq= Inicio;
Der= Fin;
Posic= Inicio;
Bandera= 1;
while (Bandera)
{
Bandera= 0;
while ((Datos[Posic] <= Datos[Der]) && (Posic != Der))
Der--;
if (Posic != Der)
{
Intercambia(Posic, Der);
Posic= Der;
while ((Datos[Posic] >= Datos[Izq]) && (Posic != Izq))
Izq++;
if (Posic != Izq)
{
Bandera=1;
Intercambia(Posic, Izq);
Posic= Izq;
}
}
}
if ((Posic-1) > Inicio)
Reduce(Inicio, Posic-1);
if (Fin > (Posic+1))
Reduce(Posic+1, Fin);
}
}
您应该始终在头文件中添加头保护。此外,您还在标头中定义了类Alumno
的成员函数。最好将Alumno
等非模板类的成员函数的实现放在源文件中,如下所示(请参阅DEMO(。我所做的改动列在我的答案的末尾。
明矾h
#ifndef ALUMNO_H //add include guards
#define ALUMNO_H
#include <iostream>
//removed using namespace std;
class Alumno {
private:
int Clave;
char Nombre[64];
public:
Alumno();
Alumno(int, char *);
int operator > (Alumno);
friend std::istream &operator >> (std::istream &, Alumno &);
friend std::ostream &operator << (std::ostream &,const Alumno &); //made the second parameter a reference to const Alumno
};
#endif
Alumino.cpp
#include "Alumno.h"
#include<stdio.h>
#include<cstring>
Alumno::Alumno()
{}
Alumno::Alumno(int Cla, char Nom[])
{
Clave= Cla;
strcpy(Nombre, Nom);
}
int Alumno::operator > (Alumno ObjAl)
{
if (Clave > ObjAl.Clave)
return 1;
else
return 0;
}
std::istream &operator>>(std::istream &Lee,Alumno &ObjAl)
{
std::cout<<"nnIngrese clave del alumno: ";
Lee>>ObjAl.Clave;
std::cout<<"nnIngrese nombre del alumno: ";
Lee>>ObjAl.Nombre;
return Lee;
}
std::ostream &operator << (std::ostream &Escribe,const Alumno &ObjAl)//made the second parameter a reference to const Alumno
{
Escribe<<"nnDatos del alumnon";
Escribe<<"nClave: "<<ObjAl.Clave;
Escribe<<"nNombre: "<<ObjAl.Nombre<<"n";
return Escribe;
}
MetOrdena.h
#ifndef METORDENA_H
#define METORDENA_H
#define MAX 100
template <class T>
class Arreglos
{
//private:
public:
T Datos[MAX];
int Tam;
Arreglos();
int RegresaTam();
T RegresaValor(int);
void AsignaValor(int, T);
void Intercambia(int, int);
void IntercDirectoIzq();
void InsercionDirecta();
void SeleccionDirecta();
void QuickSort();
void Reduce(int, int);
void Lectura();
void Escribe();
};
template <class T>
Arreglos<T>::Arreglos()
{
Tam=0;
}
template <class T>
void Arreglos<T>::Intercambia(int Ind1, int Ind2)
{
T Auxiliar;
Auxiliar= Datos[Ind1];
Datos[Ind1]= Datos[Ind2];
Datos[Ind2]= Auxiliar;
}
template <class T>
void Arreglos<T>::IntercDirectoIzq()
{
int Ind1, Ind2;
for (Ind1= 1; Ind1< Tam; Ind1++)
for (Ind2= Tam-1; Ind2 >= Ind1; Ind2--)
if (Datos[Ind2-1] > Datos[Ind2])
Intercambia(Ind2-1, Ind2);
}
template <class T>
void Arreglos<T>::InsercionDirecta()
{
int Auxiliar, Indice, IndAux;
for (Indice= 1; Indice < Tam; Indice++)
{
Auxiliar= Datos[Indice];
IndAux= Indice - 1;
while ((IndAux >= 0) && (Auxiliar < Datos[IndAux]))
{
Datos[IndAux+1]= Datos[IndAux];
IndAux--;
}
Datos[IndAux+1]= Auxiliar;
}
}
template <class T>
void Arreglos<T>::SeleccionDirecta()
{
int Menor, Ind1, Ind2, Ind3;
for (Ind1= 0; Ind1 < Tam-1; Ind1++)
{
Menor= Datos[Ind1];
Ind2= Ind1;
for (Ind3= Ind1+1; Ind3 < Tam; Ind3++)
if (Datos[Ind3] < Menor)
{
Menor= Datos[Ind3];
Ind2= Ind3;
}
Datos[Ind2]= Datos[Ind1];
Datos[Ind1]= Menor;
}
}
template <class T>
void Arreglos<T>::QuickSort()
{
Reduce(0, Tam-1);
}
template <class T>
void Arreglos<T>::Reduce(int Inicio, int Fin)
{
if ( Tam > 0)
{
int Izq, Der, Posic, Bandera;
Izq= Inicio;
Der= Fin;
Posic= Inicio;
Bandera= 1;
while (Bandera)
{
Bandera= 0;
while ((Datos[Posic] <= Datos[Der]) && (Posic != Der))
Der--;
if (Posic != Der)
{
Intercambia(Posic, Der);
Posic= Der;
while ((Datos[Posic] >= Datos[Izq]) && (Posic != Izq))
Izq++;
if (Posic != Izq)
{
Bandera=1;
Intercambia(Posic, Izq);
Posic= Izq;
}
}
}
if ((Posic-1) > Inicio)
Reduce(Inicio, Posic-1);
if (Fin > (Posic+1))
Reduce(Posic+1, Fin);
}
}
#endif
Arreglo.h
#ifndef ARREGLO_H
#define ARREGLO_H
#include<iostream>
#include<stdio.h>
#define MAX 100
using namespace std;
template <class T>
class Arreglo
{
private:
T Datos[MAX];
int Tam;
public:
Arreglo();
int RegresaTam();
T RegresaValor(int);
void AsignaValor(int, T);
void Lectura();
void Escribe();
};
template <class T>
Arreglo<T>::Arreglo()
{
Tam= 0;
}
template <class T>
int Arreglo<T>::RegresaTam()
{
return Tam;
}
template <class T>
T Arreglo<T>::RegresaValor(int Indice)
{
return Datos[Indice];
}
template <class T>
void Arreglo<T>::AsignaValor(int Indice, T Valor)
{
Datos[Indice]= Valor;
}
template <class T>
void Arreglo<T>::Lectura()
{
int Indice;
do {
cout<<"nn Ingrese total de elementos: ";
cin>> Tam;
} while (Tam < 1 || Tam > MAX);
for (Indice= 0; Indice < Tam; Indice++)
{
cout<<"nIngrese el "<<Indice + 1<<" dato: ";
cin>> Datos[Indice];
}
}
template <class T>
void Arreglo<T>::Escribe()
{
int Indice;
if (Tam > 0)
{
cout<<"nn";
for (Indice= 0; Indice < Tam; Indice++)
cout<< "t" << Datos[Indice];
cout<<"nn";
}
else
cout<< "n No hay elementos almacenados.";
}
#endif
main.cpp
#include "Alumno.h"
#include "Arreglo.h"
#include "MetOrdena.h"
#include<iostream>
using namespace std;
int main()
{
Arreglo<Alumno> Escuela;
Escuela.Lectura();
/*
IntercDirectoIzq<Alumno> Orden;
Orden.Ordena(&Escuela);
*/
Escuela.Escribe();
if (Escuela.RegresaTam() != 0)
cout<<"Los datos del primer alumno son:"<<endl;
cout<< Escuela.RegresaValor(0);
return 0;
}
上面修改的程序的输出可以在这里看到。
正如你所看到的,我已经重构了代码。我做的一些更改包括:
- 添加了在页眉内的页眉保护。这是一种推荐的做法
- 将非模板类
Alumno
的成员函数的实现移动到一个名为Alumno.cpp
的单独源文件中 - 在
Alumno.h
和Alumno.cpp
内重载的operator<<
的friend
函数声明的第二个参数中添加了低级别的const
- 添加了一个定义了
main()
函数的main.cpp
文件 - 删除了
IntercDirectoIzq<Alumno> Orden;
,因为IntercDIrectoIzq
是一个成员函数,所以删除的语句没有意义