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)在类模板、类模板的嵌套类、类模板的成员或类模板的嵌套类的成员的定义中,类模板或嵌套类的注入类名称[…]
- 在类模板的定义中,类模板[“或嵌套类”的注入类名称不适用于这种情况]
- 在类模板的嵌套类的定义中,类模板或嵌套类的注入类名
- 在类模板的成员定义中,类模板的的注入类名[“或嵌套类”不起作用 不适用于本案]
- 在类模板的嵌套类的成员定义中,类模板或嵌套类的注入类名
#2
,我们在类模板(即a
)的定义中,这意味着只有类模板本身的名称,即a
,引用当前实例化
你同意这个句子含糊不清吗 鉴于上述情况,我不会说它是模糊的(因为这意味着一些模糊,我看不到),但可能是不必要的复杂。如果将其分为两个单独的段落,可以说会更清楚: 名字