c 依赖性名称:是否需要此类型

C++ dependent name: Is this typename required?

本文关键字:类型 是否 依赖性      更新时间:2023-10-16

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在b.cpp中抱怨cannot resolve variable GroupNode。不使用typename可以驯服Clion警告,但是我想知道是否需要此typename?如果是这样,为什么G /Clang 没有发出任何警告?

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

当A 合格-ID 旨在指代不是当前实例化的类型(14.6.2.1) 及其 nested-name-depifier 是指依赖类型,它应由关键字typename前缀,形成 a 打字机。如果A em> typename-nepifier中的合格-ID 不表示类型,则该程序不正确 形成。

这里没有 nested-name-name-depifier 指的是依赖类型,因此不需要typename。( nested-name-name-name-name-dem 是指::和左侧的类型或名称空间。显然, std不是类型,更不用说类型。)