typename 和 class在模板使用的时候的区别

来源:互联网 发布:淘宝优惠券抢不到 编辑:程序博客网 时间:2024/05/06 02:29

如果是模板的声明如:template <class T>   //template<typename T>      他们两个是没区别的,只是习惯而已:本人习惯用typename因为这个看起来不限于class类;本来在设计C++的时候为了减少关键字是不要设计typename了,但是在内嵌依赖类型中typename 用到所以也就这能增加了typename关键字()。下面有对内嵌依赖类型名讲解;

   template <class T>   //template<typename T>                                                                                   

           class name{

                                 name(){

                                  }

                                  void method(){

                                   }

                              }

                              template <class T>

                              void  template<class T> name::method(){

                          }

内嵌依赖类型名的情况:

          template<typename C>
          void print2nd(const C& container)
            {
            C::const_iterator * x;
           ...
           }

这看上去好像是我们将 x 声明为一个指向 C::const_iterator 的 local variable(局部变量)。但是它看上去如此仅仅是因为我们知道 C::const_iterator 是一个 type(类型)。但是如果 C::const_iterator 不是一个 type(类型)呢?如果 C 有一个 static data member(静态数据成员)碰巧就叫做 const_iterator 呢?再如果 x 碰巧是一个 global variable(全局变量)的名字呢?在这种情况下,上面的代码就不是声明一个 local variable(局部变量),而是成为 C::const_iterator 乘以 x!当然,这听起来有些愚蠢,但它是可能的,而编写 C++ 解析器的人必须考虑所有可能的输入,甚至是愚蠢的。

那么我们只能通过在

           template<typename C>
                       void print2nd(const C& container)
            {
        typename    C::const_iterator * x;
           ...
           }

这样来确定const_iterator一定是类型而不是变量;

原创粉丝点击