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

时间:2016-11-23 05:26:30

标签: c++ templates language-lawyer dependent-name

在我定义的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可以驯服Clion警告,但我想知道是否需要这个typename?如果是这样,为什么g ++ / clang ++没有发出任何警告?

1 个答案:

答案 0 :(得分:5)

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

  

qualified-id 旨在引用不是当前实例化成员的类型时(14.6.2.1)   并且它的嵌套名称说明符是指依赖类型,它应以关键字typename为前缀,形成    typename-specifier 。如果 typename-specifier 中的 qualified-id 不表示类型,则该程序不正常   形成。

此处没有引用依赖类型的嵌套名称说明符,因此不需要typename。 ( nested-name-specifier 指向::及其左侧的类型或命名空间。显然,std不是类型,更不是依赖类型。)< / p>