Ecco la soluzione togliendo l'enum globale.
#include "stdafx.h"
#include <iostream>
#include <functional>
#include <string>
using namespace std;
struct studenti
{
string nome;
int voto;
friend ostream & operator <<(ostream & os, const studenti & rhs)
{
os << rhs.nome << " - " << rhs.voto << endl;
return os;
}
studenti & operator=(const studenti & rhs)
{
if(this != &rhs)
{
nome = rhs.nome;
voto = rhs.voto;
}
return *this;
}
bool ordinaNome(const studenti & rhs) const
{
return nome > rhs.nome;
}
bool ordinaVoto(const studenti & rhs) const
{
return voto > rhs.voto;
}
};
template <class C>
void Stampa(C *vet, int nv)
{
for(int i=0; i<nv; i++)
cout<<vet[i]<<endl;
}
template <typename T, typename C>
void Ordina(T *vet, int nv, C c)
{
int scambi;
do
{
scambi=0;
for(int i=0; i<nv-1; i++)
{
if(c(vet[i+1],vet[i]))
{
T appoggio=vet[i];
vet[i]=vet[i+1];
vet[i+1]=appoggio;
scambi++;
}
}
} while(scambi!=0);
}
int main()
{
studenti vet[3];
vet[0].nome = "Tizio";
vet[0].voto = 18;
vet[1].nome = "Pallo";
vet[1].voto = 15;
vet[2].nome = "Pinco";
vet[2].voto = 25;
int nv=3;
cout<<"Stampa di un vettore"<<endl;
Stampa(vet, nv);
Ordina(&vet[0], nv,mem_fun_ref(&studenti::ordinaVoto));
cout<<"Stampa di un vettore intero ordinato per voto"<<endl;
Stampa(vet, nv);
Ordina(&vet[0], nv,mem_fun_ref(&studenti::ordinaNome));
cout<<"Stampa di un vettore intero ordinato per nome"<<endl;
Stampa(vet, nv);
}
Praticamente chiami le funzioni membro della struttura a seconda del tipo di ordinamento.
Al template li passi un functor reso possibile dalla funzione mem_fun_ref del header functional. Ma non so se ste cose li hai imparate o li devi imparare. Cmq un metodo più semplice non lo vedo io.