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

问题描述 投票:7回答:3

我在C ++中有这个代码

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

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

它给了我两个错误消息:

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

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

添加

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

c++ g++
3个回答
12
投票

那么,typename在那里做什么?你不是指嵌套类型,所以typename在那里是完全没必要的。我要说错误是由于没有合理使用typename引起的,而不是通过订购声明的部分或其他任何内容。

它应该是公正的

const DD<T>& mContainer;

甚至

const DD& mContainer;

4
投票

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

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

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

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


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)。

© www.soinside.com 2019 - 2024. All rights reserved.