g ++“不是类型”错误

时间:2009-08-19 17:17:04

标签: c++ gcc templates

写一个模板化函数,我声明:

template <typename T>
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex);

使用g ++ 4.0.1编译我收到错误:

error: 'T::size_type' is not a type

4 个答案:

答案 0 :(得分:29)

您需要添加typename。

即。

template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);

如果没有关于类型T的任何信息,编译器需要知道T :: size_type指定一个类型。

从标准第14.6.2节:

  

模板声明或定义中使用的名称取决于模板参数,假定不命名类型,除非适用的名称查找找到类型名称或名称由关键字typename限定。

答案 1 :(得分:7)

正如您所发现的,T :: size_type需要以typename为前缀。 为什么呢?

来自"C++ Templates: The Complete Guide"

  

语言定义通过指定通常依赖的限定名称​​ not 表示类型来解决此问题,除非该名称以关键字typename为前缀。

     

...当名称

时,名称的typename前缀为 required      
      
  1. 出现在模板中
  2.   
  3. 合格
  4.   
  5. 不用作基类规范列表或引入构造函数定义的成员初始化列表
  6.   
  7. 依赖于模板参数
  8.         

    此外,typename前缀不允许,除非至少前三个条件成立。

答案 2 :(得分:3)

因为在解析模板声明期间,T是未知的。所以编译器根本不知道T :: size_type是否存在。例如,它可以指代静态变量。当您稍后使用模板时,T当然是已知的,但错误发生得更早。请使用比gcc 4.0.1更古老的东西; - )

编辑:如果用-fpermissive编译它,编译器可能会咀嚼你的代码,但他会发出警告。

答案 3 :(得分:0)

原来我需要指定T :: size_type是一个typename。那是为什么?

template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);