шаблоны — C ++ зависимое имя: требуется ли это имя типа?

В a.hpp Я определил:

#include <utility>
namespace Board {
template<int W, int H>
struct GroupNode
{
using PointType = std::pair<int, int>;
// ...
};
}

Затем в b.cpp Я определил:

#include "a.hpp"namespace Board {
template<int W, int H>
struct NodeList
{
using StdList = std::list < /* typename */ GroupNode<W, H>>;
}
}
// and then use NodeList<19, 19> nl;

Приведенный выше код может быть скомпилирован как на gcc-6, так и на clang-3.9 без предупреждения.
Тем не менее, Clion 2016.3 жаловался cannot resolve variable GroupNode в b.cpp, раскомментировав typename может приручить предупреждение Клиона, но мне было интересно, если это typename необходимо? Если так, то почему g ++ / clang ++ не выдал никаких предупреждений?

5

Решение

Нет, это не обязательно. Согласно [temp.res] / 3 в C ++ 14:

Когда Квалифицированный-идентификатор предназначен для ссылки на тип, который не является членом текущего экземпляра (14.6.2.1)
И его вложенное имя спецификатор относится к зависимому типу, к нему должно быть добавлено ключевое слово typename, образуя
имяТипа спецификатор . Если Квалифицированный-идентификатор в имяТипа спецификатор не обозначает тип, программа плохо
формируется.

Здесь нет вложенное имя спецификатор ссылаясь на зависимый тип, так typename не требуется. (вложенное имя спецификатор относится к :: и тип или пространство имен слева от него. Очевидно, что std это не тип, а тем более зависимый тип.)

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector