Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在封闭类模板中使用嵌套类名时,是否将其视为当前实例化_C++_Templates_Language Lawyer - Fatal编程技术网

C++ 在封闭类模板中使用嵌套类名时,是否将其视为当前实例化

C++ 在封闭类模板中使用嵌套类名时,是否将其视为当前实例化,c++,templates,language-lawyer,C++,Templates,Language Lawyer,根据规则: 当限定id要引用的类型不是当前实例化的成员([temp.dep.type]),且其嵌套名称说明符引用的是从属类型时,它的前缀应为关键字typename,形成typename说明符。如果typename说明符中的限定id不表示类型或类模板,则程序的格式不正确 这意味着,当当前实例化的成员用作类型说明符时,不必在其前面加上关键字typename 请考虑以下代码: #包括 模板 结构A{ 结构B{ 结构C{ A::B*p;/#5 }; B::C;/#3 A::B::C d;/#4 };

根据规则:

当限定id要引用的类型不是当前实例化的成员([temp.dep.type]),且其嵌套名称说明符引用的是从属类型时,它的前缀应为关键字typename,形成typename说明符。如果typename说明符中的限定id不表示类型或类模板,则程序的格式不正确

这意味着,当当前实例化的成员用作类型说明符时,不必在其前面加上关键字
typename

请考虑以下代码:

#包括
模板
结构A{
结构B{
结构C{
A::B*p;/#5
};
B::C;/#3
A::B::C d;/#4
};
A: :B A;//#1
/*B::C B;*/#2
};
int main(){
}
当前实例化的定义是:

名称引用当前实例化(如果是)

  • 在类模板的定义中,类模板的嵌套类、类模板的成员或类模板的嵌套类的成员,类模板或嵌套类的注入类名称
  • 在主类模板或主类模板成员的定义中,类模板的名称后跟主模板(如下所述)的模板参数列表(或等效模板别名专用化)
  • 在类模板的嵌套类的定义中,作为当前实例化成员引用的嵌套类的名称,或
  • 由于当前实例化的第一个项目符号,因此
    #1
    处的声明格式良好。也就是说,在
    #1
    ,名称
    A
    当前实例化的名称
    ,类似于
    #3

    #4
    格式良好,因为它遵循
    当前实例化的第三个项目符号,因此对于
    A::B
    ,其中
    B
    是当前实例化的名称

    但是,我不明白为什么
    #2
    格式不正确,换句话说,它需要关键字
    typename
    ,根据第一个项目符号,嵌套类的名称不被视为当前实例化的名称吗

    坦白说,我不知道如何理解第一颗子弹。至少,我觉得这个句子很模糊。这是否意味着这些
    注入的类名
    s(主类名或嵌套类名)都被视为当前实例化的名称,只要在句子中列出的一个定义中<代码>#2
    似乎不支持这种解释

    我可以从示例中推断,嵌套类中的
    封闭类名
    可以被视为当前实例化的名称,但不能反过来。如果用这种方式理解这个句子,它就能理解为什么
    #5
    处的代码格式正确

    那么,如何正确阅读第一个项目符号呢?你同意这个句子含糊不清吗

    在封闭类模板中使用嵌套类名时,是否将其视为当前实例化

    没有

    然而,与本标准的许多其他段落一样,本段内容确实是满嘴的:

    名称引用当前实例化(如果是)

    • (1.1)在类模板、类模板的嵌套类、类模板的成员或类模板的嵌套类的成员的定义中,类模板或嵌套类的注入类名称[…]
    我们可能需要将其分解为不同的情况,以查看在定义类模板时,它不适用于嵌套的类名,而在定义类模板时,又定义了嵌套的类:

    名称引用当前实例化,如果是

    • 在类模板的定义中,类模板[“或嵌套类”的注入类名称不适用于这种情况]
    • 在类模板的嵌套类的定义中,类模板或嵌套类的注入类名
    • 在类模板的成员定义中,类模板的的注入类名[“或嵌套类”不起作用 不适用于本案]
    • 在类模板的嵌套类的成员定义中,类模板或嵌套类的注入类名
    其中我强调了“如果它在X的定义中(,Y的定义中),X的注入类名(或[the]Y)”之间的联系。特别注意的是,当定义为类模板时(当X为类模板时),在描述“注入的类的类名称时,在后面部分没有“a嵌套类”可供参考

    相反,无法将[temp.dep.type]/1.1解释为

    在类模板的定义中,类模板的注入类名称或类模板的任何嵌套类

    因此,在您的示例中,
    #2
    ,我们在类模板(即
    a
    )的定义中,这意味着只有类模板本身的名称,即
    a
    ,引用当前实例化


    你同意这个句子含糊不清吗

    鉴于上述情况,我不会说它是模糊的(因为这意味着一些模糊,我看不到),但可能是不必要的复杂。如果将其分为两个单独的段落,可以说会更清楚:

    名字