【问题标题】:"expected nested-name-specifier before ‘const’ error" with typename const in g++“在'const'错误之前预期嵌套名称说明符”在g ++中使用类型名const
【发布时间】:2011-03-09 17:36:57
【问题描述】:

我有这段 C++ 代码

template<typename T>
class DD
: public enumerables<T>

{
...
private:
    typename const DD<T>& mContainer;
}

它给了我两个错误信息:

  1. 错误:“const”之前的预期嵌套名称说明符
  2. 错误:“&”标记前的声明符无效

typename const 代码有什么问题?它可以用 MSVC C++ 很好地编译。

添加

typename DD&lt;T&gt;&amp; const mContainer;const typename DD&lt;T&gt;&amp; mContainer; 给我同样的错误。

【问题讨论】:

  • MSVC 从未学会在依赖上下文中正确使用 typenametemplate。不要使用模板。

标签: c++ g++


【解决方案1】:

那么,typename 在那里做什么?您指的不是嵌套类型,因此 typename 在那里完全没有必要。我会说错误是由于不合理地使用 typename 引起的,而不是由于对声明部分的排序或其他任何内容。

应该只是

const DD<T>& mContainer;

甚至

const DD& mContainer;

【讨论】:

    【解决方案2】:

    除了引入模板类型参数时,关键字typename 必须总是紧跟一个可选的全局范围:: 标记,然后是一个嵌套名称说明符;也就是说,具有一个或多个命名空间或类的东西,每个命名空间或类后跟 :: 标记。

    请参阅 C++ 标准中的语法规则:5.2(函数样式转换)、7.1.5.3(详细类型说明符)和 7.3.3(使用声明)。

    此外,14.6p5:“关键字 typename 应仅应用于限定名称,但这些名称不必依赖。”

    微软的编译器错误地接受了无效的语法。

    【讨论】:

      【解决方案3】:

      如果它对某人有帮助,因为我没有看到它作为答案或评论明确提及(尽管引用 C++ 规范的答案暗示了它),如果当依赖类型为现在。

      例如:

      <template T>
      void foo(typename const T::size_type & n);
      

      解决方法是将const 移动到typename 之前:

      <template T>
      void foo(const typename T::size_type & n);
      

      确认这适用于 GCC (4.9) 和 MSVC (2017)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多