C++依赖名称:是否需要此类型名称?

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 GroupNodeb.cpp.取消注释typename可以驯服Clion警告,但我想知道这是否typename是必需的?如果是这样,为什么g ++/clang ++没有发出任何警告?

Bri*_*ian 5

不,这不是必需的.根据C++ 14中的[temp.res]/3:

qualified-id旨在引用不是当前实例化成员的类型(14.6.2.1)并且其嵌套名称说明符引用依赖类型时,它应以关键字为前缀typename,形成typename -specifier.如果合格-ID类型名说明符不表示一个类型,该程序不合式.

这里没有引用依赖类型的嵌套名称说明符,因此typename不是必需的.(nested-name-specifier指的是a ::和它左边的类型或命名空间.显然,std它不是一个类型,更不是一个依赖类型.)