g ++"不是类型"错误

Wal*_*sen 8 c++ gcc templates

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

template <typename T>
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex);
Run Code Online (Sandbox Code Playgroud)

用g ++ 4.0.1编译我得到了错误:

error: 'T::size_type' is not a type
Run Code Online (Sandbox Code Playgroud)

Tob*_*ias 29

您需要添加typename.

template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);
Run Code Online (Sandbox Code Playgroud)

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

从标准,第14.6.2节:

假定模板声明或定义中使用的名称以及依赖于模板参数的名称不会命名类型,除非适用的名称查找找到类型名称或名称由关键字限定typename.


mac*_*llt 7

如您所知,T :: size_type需要以typename为前缀.为什么?

"C++模板:完整指南"

语言定义通过指定,一般依赖合格的名字并解决这个问题并不除非该名称与关键字类型名称前缀表示一个类型.

......是的类型名称前缀名称要求时名

  1. 出现在模板中
  2. 合格
  3. 不用作基类规范的列表,也不用于引入构造函数定义的成员初始化列表
  4. 依赖于模板参数

此外, 除非至少前三个条件成立,否则不允许使用typename前缀.