http://community.csdn.net/Expert/topic/3376/3376764.xml?temp=.5283472

解决方案 »

  1.   

    template<class TYPE, class ARG_TYPE = const TYPE&>必须是和一个类名结合使用表示一个模板类。如:template<class TYPE, class ARG_TYPE = const TYPE&>class CArray;表示这个传递给模板的成员函数的参数ARG_TYPE 缺省是TYPE的引用参考,而TYPE是CArray内部存放数据的类型。
    举个例子吧:
    template <class T, class T1 = const T&> 
    class CTest
    //定义一个模板类CTest,第二个参数类型T1缺省为第一个类型T的引用
    {
    public:
        CTest ();         //构造函数
        void Add(T1 t);   //有点像CArray中的Add()吧^_^用的形式参数类型是T1
    private:
        T a; 
                 //定义一个T类型成员变量,其实就像CArray中的存放数据的类型
                 
    };接着在CPP中定义函数的实现,注意每个成员函数前要加上template <class T, class T1>.
    //构造函数
    template <class T, class T1>
    CTest<T,T1>::CTest()
    {
    }//Add()函数的实现
    template <class T, class T1>
    void CTest<T,T1>::Add(T1 t)
    {
    a = t;
    }到些为止,这个模板类就算成功了。现在我们就试验二个问题:
    1、是否可以只填一个参数呢,答案是肯定的,可以!!
       int itest = 2;
       CTest<int> ttt;  //注意这里只填了一个参数类型,第二个参数类型缺省为int&
       ttt.Add(itest);
    2、如用第一个问题中的代码,Add(T1 t)中的这个t是否是itest的引用参考呢?答案也是肯定的。口说无凭,你只要在调试中时取itest的地址,单步执行至Add()函数内,取形参t的地址,你会发现这两个地址是一至的,这就表明T1这个数据类型的确是T的引用。