5

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

4

1 回答 1

5

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

qualified-id旨在引用不是当前实例化(14.6.2.1)成员的类型并且其nested-name-specifier引用依赖类型时,应以关键字为前缀typename,形成类型名-说明符。如果typename-specifier中的qualified-id不表示类型,则程序格式错误。

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

于 2016-11-23T05:37:26.280 回答