写一个模板化函数,我声明:
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
答案 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
- 出现在模板中
- 合格
- 不用作基类规范列表或引入构造函数定义的成员初始化列表
- 依赖于模板参数
醇>此外,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);