// 示例1
template <typename T, typename ARG_TYPE = T&>
class CMyList
{
public:
CMyList(int nSize)
{
ASSERT(nSize > 0);
m_pList = new T[m_nSize = nSize];
ZeroMemory(m_pList, m_nSize * sizeof(T));
}
~CMyList() { delete [] m_pList; }
public:
ARG_TYPE operator [] (int nPos)
{
ASSERT(nPos >= 0 && nPos < m_nSize);
return m_pList[nPos];
}
private:
int m_nSize;
T* m_pList;
};
#ifdef MAIN_TESTARGUTYPE
void AppMain()
{
CMyList<int> MyList(10);
MyList[5] = 456;
}
#endif
// 示例2
template <typename T, typename ARG_TYPE = const T&>
class CMyList
{
public:
CMyList(int nSize)
{
ASSERT(nSize > 0);
m_pList = new T[m_nSize = nSize];
ZeroMemory(m_pList, m_nSize * sizeof(T));
}
~CMyList() { delete [] m_pList; }
public:
ARG_TYPE operator [] (int nPos)
{
ASSERT(nPos >= 0 && nPos < m_nSize);
return m_pList[nPos];
}
private:
int m_nSize;
T* m_pList;
};
#ifdef MAIN_TESTARGUTYPE
void AppMain()
{
CMyList<int> MyList(10);
// error C2166: l 值指定常数对象
MyList[5] = 456;
}
#endif
总结:类型可以是指针/引用/const/一般类型的组合,如int, int*, const int*, int&, const int&都可以用做模版参数,但是注意模版实例化之后的使用方法.