【问题标题】:g++ "is not a type" errorg++“不是类型”错误
【发布时间】:2010-11-21 01:04:06
【问题描述】:

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

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

【问题讨论】:

    标签: c++ gcc templates


    【解决方案1】:

    你需要添加类型名。

    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 限定。

    【讨论】:

      【解决方案2】:

      原来我需要指定 T::size_type 是一个类型名。这是为什么呢?

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

      【讨论】:

      • 消除可能的实例名称和可能的类型名称之间的歧义。有关更多信息,请阅读 C++ 模板一书;完整指南 - 信息josuttis.com/tmplbook/tmplbook.html
      • 这应该是一个单独的问题。 (虽然之前有人问过。搜索一下)
      【解决方案3】:

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

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

      【讨论】:

      • gcc 4.0.1 是最新的——在 mac 上 :)
      • 如果为真,还有不使用 mac 的另一个原因。最新的生产质量g++是4.4.0
      • 当您得知 9 月发布的 Mac 10.6 将默认使用 gcc 4.2.1 时,我想您不会感到高兴吗?
      【解决方案4】:

      你发现 T::size_type 需要以 typename 为前缀。 为什么?

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

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

      ...名称的类型名称前缀是必需的,当名称时

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

      此外,类型名前缀是不允许的,除非至少前三个条件成立。

      【讨论】:

      • 我现在已经阅读了那篇文章,谢谢(那些在家里阅读的人可以看到第130页的详细解释)。我仍然不明白为什么在参数声明中需要“typename”,因为它必须是一种类型,但也许这只是为了与一般的语句保持一致。
      • @wnissen:通常存在这样的要求是为了让解析器构建者满意。部分问题在于您显然已经知道这是一个参数声明。由于“最棘手的解析”问题,解析器通常必须从 () 之间的标记中推断出这一点。现在,如果你说 () 之间的标记的解释应该依赖于知道它是一个参数声明,那么你就引入了一个循环解析问题。
      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2021-02-19
      • 2018-04-28
      • 2019-02-14
      • 2021-10-02
      • 2021-10-30
      相关资源
      最近更新 更多