typename关键字
Dec 6, 2013
昨天的课程信息量有点大,听完感觉还蛮累的,尤其是在理解hashtable的源代码的时候,模板的泛化和特化参杂函数对象,还是有些小复杂的。
总体上来说听得很懂,但看到有些疑惑:1typedef typename rep_type::const_iterator iterator;
我们知道typename的一个比较常用的方法是写在模板声明里面,可以和class互换。比如:1template <typename T>
但在这里,显然不是这个用法。乍看之下,那段代码应该是在define
一个类型,相当于后面出现的iterator都应该是 typename rep_type::const_iterator
的一个代称,所以这个应该是一种类型。但是这种类型为什么要有typename
关键字加进去呢?这就牵扯到一个语言歧义问题。我们换一个例子可能会更清楚,比如我们有如下的代码:1234template <class T>void test(){ T::var *p;}
对于这样的代码,我们应该如何解释呢?有两种,一是定义了一个指向T::var
类型的指针,另外一个意思其实是T::var
是一个变量,与p变量做了一次乘法。编译器也是这样理解的,他很难知道这里的T::var
到底是一个类型名称还是一个变量名,这就产生了歧义。于是为了避免这种现象发生,C++标准语言规定,当出现上述写法的时候,编译器默认T::var
是一个变量而非对象,所以T::var *p
会被解释为乘法而不是类型。那么我们如果需要让编译器将其理解为类型的话应该如何做呢?就加上typename
关键字好了。