«Ожидаемый спецификатор вложенного имени перед ошибкой« const »с типом const в g ++ - PullRequest
7 голосов
/ 09 марта 2011

У меня есть этот код в 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; выдают мне ту же ошибку.

Ответы [ 3 ]

12 голосов
/ 09 марта 2011

Ну, а что там делает typename? Вы не имеете в виду вложенный тип, поэтому typename здесь совершенно не нужен. Я бы сказал, что ошибка вызвана этим неоправданным использованием typename, а не упорядочением частей декларации или чем-то еще.

Это должно быть просто

const DD<T>& mContainer;

или даже

const DD& mContainer;
4 голосов
/ 09 марта 2011

За исключением случаев, когда вводится параметр типа шаблона, после ключевого слова typename должно всегда сразу следовать необязательный токен global-scope ::, а затем спецификатор вложенного имени ; то есть то, что имеет одно или несколько пространств имен или классов, за каждым из которых следует маркер ::.

См. Правила синтаксиса в Стандарте C ++: 5.2 (приведение к стилю функции), 7.1.5.3 (разработанный спецификатор типа) и 7.3.3 (с использованием объявления).

Также, 14.6p5: «Ключевое слово typename должно применяться только к квалифицированным именам, но эти имена не должны быть зависимыми».

Компилятор Microsoft неверно принимает неверный синтаксис.

0 голосов
/ 07 марта 2019

В случае, если это кому-то помогает, поскольку я не вижу его явно упомянутым как ответ или комментарий (хотя на него ссылаются ответы, которые ссылаются на спецификации 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).

...