详细说明的类型说明符中的类型相关嵌套名称说明符
type-dependent nested-name-specifier in elaborated-type-specifier
在这个问题之前,我从未在详细的类型说明符中看到过嵌套的名称说明符,乍一看,我以为它甚至不在语法中。现在我看到,从C++98到现在,它被翻译为一个特例,没有类型名说明符构造。C++11 7.1.6.3/2(C++98中的7.1.5.3/2):
3.4.4描述了如何在细化的类型说明符中对标识符进行名称查找。如果标识符解析为类名或枚举名,则详细类型说明符将其引入声明的方式与简单类型说明符引入其类型名
因此,尽管您可以形成一个合格的详细阐述的类型说明符,但您需要注意它从不依赖于类型。在模板定义时,根据3.4.4进行的名称解析将永远找不到类名,因为除非以typename
关键字为前缀,否则依赖名称将被假定为对象,这在上下文中是语法上不允许的。
这是对标准含义和语言设计意图的准确评估吗?
从注释展开:
以这个程序为例:
template <typename T>
struct S1 { struct I { }; };
template <typename T>
struct S2 { typedef struct S1<T>::I I; }; // okay
template <typename T>
struct S3 { typedef struct S2<T>::I I; }; // okay at definition time
// usually error at instantiation time
template <>
struct S2<short> : S1<short> { };
int main() {
S1<int>::I a;
S2<int>::I &b = a; // okay
S3<int>::I &c = b; // error
S1<short>::I d;
S2<short>::I &e = d; // okay
S3<short>::I &f = e; // okay
}
在模板定义时,S2
和S3
都可以:14.6p5列出了不需要typename
的例外情况。本质上:如果使用是明确的,因为名称永远不能是类型以外的任何东西,则不需要typename
。这包括在语法上不允许typename
的几种情况,因此需要typename
意味着无法编写程序。typename struct S<T>::I
和struct typename S<T>::I
都是硬错误,struct S<T>::I
是明确的。
在模板实例化时,3.4.4的规则更清晰:然后可以找到struct S1<int>::I
和struct S2<int>::I
,其中S2<int>::I
显然是typedef,因此struct S2<int>::I
是一个错误。同时,在这一点上,S2<short>::I
不是一个typedef,而是一个结构,因此struct S2<short>::I
是允许的。
- 缺少类型说明符,显式类型为"缺少错误"
- 与 tesseract::TessBaseApi() 相关的 Tesseract-OCR 出错(预期的类型说明符)
- 为什么转换函数声明不需要至少一个定义类型说明符
- C++需要所有声明的类型说明符和预期的非限定 id(需要调试帮助)
- printf 数据类型说明符复杂问题
- C++错误:"class name"之前的预期类型说明符
- 缺少类型说明符和另一个问题
- 缺少类型说明符 - 假定为 int.注意 c++ 不支持 default-int
- 错误:C4430:缺少类型说明符-假定为int.注意:C++不支持default-int
- 在C++中出现错误之前,无效使用了不完整的类型和所需的类型说明符
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 不能在类型说明符中定义联合
- 没有带有字符串数组的存储类或类型说明符
- 警告:函数使用不带尾随返回类型的'auto'类型说明符
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 在 C++ 中出现unique_ptr错误之前的预期类型说明符
- 有没有办法将类型说明符存储在变量中
- C 期望类对象的类型说明符
- 是无符号的int"简单类型说明符"
- 在 vscode 上编译错误.类型说明符是 C++11 扩展