C++ 嵌套类是类模板中的依赖类型吗?
考虑以下几点:C++ 嵌套类是类模板中的依赖类型吗?,c++,templates,c++17,dependent-name,C++,Templates,C++17,Dependent Name,考虑以下几点: template<class> struct T { struct T1 { struct T2 { }; }; /*typename*/ T1::T2 m; }; 模板结构 { 结构T1 { 结构T2 { }; }; /*typename*/T1::t2m; }; 如果没有typename,编译将失败,因为T2被视为从属名称,因此不是类型。在查看了C++17标准草案(N4659)之
template<class> struct T
{
struct T1
{
struct T2
{
};
};
/*typename*/ T1::T2 m;
};
模板结构
{
结构T1
{
结构T2
{
};
};
/*typename*/T1::t2m;
};
如果没有typename
,编译将失败,因为T2被视为从属名称,因此不是类型。在查看了C++17标准草案(N4659)之后,我相信我已经确定了原因:
§17.6.2.1¨5
如果名称是-一种非限定名称,在查找时,它指的是作为当前实例化的类或其非依赖基类的至少一个成员。
…
如果名称是当前实例化的成员,并且在查找时引用了作为当前实例化的类的至少一个成员,则名称是当前实例化的从属成员 T1是当前实例化的依赖成员。T2不是当前实例化的成员(它是T1的成员) §17.6.2.1¨9.3 如果类型是
…
-作为当前实例化的从属成员的嵌套类或枚举,
T1是嵌套类,因此是依赖类型 §17.6¨3 当限定id旨在引用不是当前实例化(17.6.2.1)成员的类型,且其嵌套名称说明符引用从属类型时,其前缀应为关键字typename,形成typename说明符 因此,需要
typename
我的理解正确吗?如果是,这背后的理由是什么?查找T1::T2
时,除了嵌套在T1中的T2之外,怎么可能找到其他内容 是的,你是对的
在您的情况下,这并不重要,因为您不可能在不实例化m
(因为它是类成员)的情况下专门化T1
。但您可以这样做,将m
放入函数中:
template<class> struct T
{
struct T1
{
struct T2
{
};
};
void foo() {
typename T1::T2 m;
}
};
template<>
struct T<void>::T1 {
int T2;
};
模板结构
{
结构T1
{
结构T2
{
};
};
void foo(){
类型名T1::t2m;
}
};
模板
结构T::T1{
int T2;
};
如果T1
不相关,则代码可能会更改含义,因为T2
将引用值而不是类型