“在'const'错误之前预期的嵌套名称说明符”,其中typename为in g ++

时间:2011-03-09 17:36:58

标签: c++ g++

我在C ++中有这段代码

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

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

它给了我两条错误信息:

  1. 错误:'const'
  2. 之前的预期嵌套名称说明符
  3. 错误:'&amp;'令牌
  4. 之前的声明者无效

    typename const代码有什么问题?它使用MSVC C ++编译好。

    ADDED

    typename DD<T>& const mContainer;const typename DD<T>& mContainer;给了我同样的错误。

3 个答案:

答案 0 :(得分:12)

嗯,typename在那做什么?您没有提到嵌套类型,因此typename完全没必要。我会说这个错误是由typename的无理使用造成的,而不是通过对声明部分或其他任何内容的排序。

应该只是

const DD<T>& mContainer;

甚至

const DD& mContainer;

答案 1 :(得分:4)

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

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

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

Microsoft的编译器接受无效语法是错误的。

答案 2 :(得分:0)

如果它对某人有所帮助,因为我没有看到它明确地作为答案或注释提及(尽管引用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)。