За исключением случаев, когда вводится параметр типа шаблона, после ключевого слова typename
должно всегда сразу следовать необязательный токен global-scope ::
, а затем спецификатор вложенного имени ; то есть то, что имеет одно или несколько пространств имен или классов, за каждым из которых следует маркер ::
.
См. Правила синтаксиса в Стандарте C ++: 5.2 (приведение к стилю функции), 7.1.5.3 (разработанный спецификатор типа) и 7.3.3 (с использованием объявления).
Также, 14.6p5: «Ключевое слово typename
должно применяться только к квалифицированным именам, но эти имена не должны быть зависимыми».
Компилятор Microsoft неверно принимает неверный синтаксис.