テンプレート関数でクラスを引数にもできる

#include <stdio.h>
#include <string.h>

class CPerson
{
public:
	char*	m_pszName;	//名前
	int	m_nAge;		//年齢
	CPerson(char*, int);
	CPerson(){m_pszName = NULL; m_nAge = 0;}
	~CPerson(){if(m_pszName) delete[] m_pszName;}
	CPerson(CPerson&);
	CPerson& operator=(CPerson&);
};

CPerson::CPerson(char* pszName, int nAge)
{
	m_pszName = new char[strlen(pszName) + 1];
	strcpy(m_pszName, pszName);
	m_nAge = nAge;
}

CPerson::CPerson(CPerson& p)
{
	m_pszName = new char[strlen(p.m_pszName) + 1];
	strcpy(m_pszName, p.m_pszName);
	m_nAge = p.m_nAge;
}

CPerson& CPerson::operator=(CPerson& p)
{
	if(m_pszName) delete[] m_pszName;
	m_pszName = new char[strlen(p.m_pszName) + 1];
	strcpy(m_pszName, p.m_pszName);
	m_nAge = p.m_nAge;
	return *this;
}

bool operator<(CPerson& p1, CPerson& p2)
{
	int nRet = strcmp(p1.m_pszName, p2.m_pszName);
	if(nRet == 0) return p1.m_nAge < p2.m_nAge;
	else return nRet < 0;
}

template<class TYPE> void Sort(TYPE a[], int n)
{
	int i, j;
	for(i = 1; i < n; i++){
		j = i;
		while(j > 0 && a[j] < a[j-1]){
			Swap(a[j], a[j-1]);
			j--;
		}
	}
}

template<class TYPE> void Swap(TYPE& a, TYPE& b)
{
	TYPE tmp = a;
	a = b;
	b = tmp;
}

int main()
{
	CPerson a[10];
	char* b[10] = {"yamazaki", "taniguchi", "hashimoto", "inoue", "yamada", 
			"nishimoto", "aoki", "imai", "nishiwaki", "aoki"};
	int c[10] = {45, 25, 38, 53, 68, 42, 18, 27, 62, 35};
	
	for(int i = 0; i < 10; i++){
		a[i].m_pszName = new char[strlen(b[i]) + 1];
		strcpy(a[i].m_pszName, b[i]);
		a[i].m_nAge = c[i];
	}
	
	Sort(a, 10);
	
	for(int i = 0; i< 10; i++)
		printf("%-10s %d\n", a[i], b[i]);
		
	return 0;
}
実行結果
aoki       18
aoki       35
hashimoto  38
imai       27
inoue      53
nishimoto  42
nishiwaki  62
taniguchi  25
yamada     68
yamazaki   45