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
将引用值而不是类型