2016-11-23 81 views
5

a.hpp我定义:C++依赖名称:是否需要此类型名称?

#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和铛-3.9没有任何警告进行编译。 但是,Clion 2016.3在b.cpp中抱怨cannot resolve variable GroupNode。取消注释typename可能会驯服Clion警告,但我想知道是否需要此typename?如果是这样,为什么g ++/clang ++没有发出任何警告?

回答

5

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

合格-ID是指一种类型的不属于当前实例中的一员(14.6.2.1) 其嵌套名称说明符涉及依赖类型,它应以关键字typename为前缀,形成 a 类型名称说明符。如果合格代码中的类型名称说明符不表示类型,则程序形成。

这里没有嵌套名称说明符参照一个依赖型,所以typename不是必需的。 (嵌套名称说明符指的是::及其左侧的类型或名称空间。很明显,std不是一种类型,更不用说依赖类型。)