В 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 ++ не выдал никаких предупреждений?
Нет, это не обязательно. Согласно [temp.res] / 3 в C ++ 14:
Когда Квалифицированный-идентификатор предназначен для ссылки на тип, который не является членом текущего экземпляра (14.6.2.1)
И его вложенное имя спецификатор относится к зависимому типу, к нему должно быть добавлено ключевое словоtypename
, образуя
имяТипа спецификатор . Если Квалифицированный-идентификатор в имяТипа спецификатор не обозначает тип, программа плохо
формируется.
Здесь нет вложенное имя спецификатор ссылаясь на зависимый тип, так typename
не требуется. (вложенное имя спецификатор относится к ::
и тип или пространство имен слева от него. Очевидно, что std
это не тип, а тем более зависимый тип.)
Других решений пока нет …