lz9*_*z96 5 c++ templates dependent-name language-lawyer
在a.hpp我定义:
#include <utility>
namespace Board {
template<int W, int H>
struct GroupNode
{
using PointType = std::pair<int, int>;
// ...
};
}
Run Code Online (Sandbox Code Playgroud)
然后,在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;
Run Code Online (Sandbox Code Playgroud)
上面的代码可以在gcc-6和clang-3.9上编译而不会发出任何警告.然而,克利翁2016.3抱怨cannot resolve variable GroupNode在b.cpp.取消注释typename可以驯服Clion警告,但我想知道这是否typename是必需的?如果是这样,为什么g ++/clang ++没有发出任何警告?
不,这不是必需的.根据C++ 14中的[temp.res]/3:
当qualified-id旨在引用不是当前实例化成员的类型(14.6.2.1)并且其嵌套名称说明符引用依赖类型时,它应以关键字为前缀
typename,形成typename -specifier.如果合格-ID的类型名说明符不表示一个类型,该程序不合式.
这里没有引用依赖类型的嵌套名称说明符,因此typename不是必需的.(nested-name-specifier指的是a ::和它左边的类型或命名空间.显然,std它不是一个类型,更不是一个依赖类型.)