C++ Templates读书笔记< 二 > Tricky Basics

* 关键字typename,用来说明某个标志符是个型别.

eg: 
1         template < typename T >
2         class MyClass
3         {
4             typename T::SubType* ptr;
5             
6         };
* assignment运算的template版本并不会取代default assignment运算

* 双重模板参数: Template Template Parameters
eg:
 1         template < typename T, 
 2                 template < typename ELEM
 3                            typename ALLOC = std::alloctator<ELEM> > 
 4                 class CONT = std::deque
 5                 >
 6         class Stack
 7         {
 8             COUT<T> elems;        // 以第一个参数的型别完成了实例化, 也可以利用class template内的任何型别 来实例化
10         };
11     // 注:template template arguments必须完全匹配对应的参数。预设的template arguments会被编译器忽略。
12     // 所以,如果上面没有写 typename ALLOC = std::alloctator<ELEM> 就会报错
function templates 不允许拥有template template parameters
* 初始化
eg:
 1         template < typename T >
 2         class MyClass
 3         {
 4         private:
 5             T x;
 6         public:
 7             MyClass()
 8                 : x()    // 即使T为build-in type,x也可以被初始化
 9             {
10             }
11         };

* 只有by value传参时,才会发生 array to pointer 的转换

eg:

 1 template < typename T >
 2         inline T const& max( T const& a, T const& b )
 3         {
 4             return a < b ? b : a;
 5         }
 6         
 7         max( "apple""peach" );    // ok
 8         max( "apple""tomato" );    // error, 型别不同,一个是char const[6],一个是char const[7]
 9         
10         template < typename T >
11         inline T max( T a, T b )
12         {
13             return a < b ? b : a;
14         }
15         
16         max( "apple""peach" );    // ok
17         max( "apple""tomato" );    // ok, 发生了array to pointer的转换, 但比较结果是错的,因为实际上比较的是指针地址


版权声明
:本篇为原创文章,允许转载,但转载时请务必以超链接形式标明文章的原始出处和作者信息。请尊重本人的劳动成果,谢谢!

小祥的BLOG http://xfxsworld.cnblogs.com