c 依赖性名称:是否需要此类型
C++ dependent name: Is this typename required?
在 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
不是类型,更不用说类型。)
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 检查函数返回类型是否与STL容器类型值相同
- 检查某些类型是否是模板类 std::optional 的实例化
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 如何检查模板类型是否可以从给定类型构造
- 用于检测函数类型是否为否的特征
- 了解类型是否可调用
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 键入特征以检查类型是否可从流和 MSVC 读取
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 如何获取类型是否真正可移动可构造
- 在编译时检查类型是否为 std::basic_string<T> C++
- 在C++中,转换为simd类型是否有未定义的行为
- POD类型是否完全等同于琐碎的标准布局类型
- 聚合类型是否意味着它也是标准布局
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 特征:从数组类型中获取标量类型是否记录?