为什么我在 Visual C++ 中尝试此操作时会出现错误?
struct S { };
typedef S *S;
C++不让您typedef
使用以前仅声明为class
orstruct
的名称吗?
还是我误解了发生了什么?
为什么我在 Visual C++ 中尝试此操作时会出现错误?
struct S { };
typedef S *S;
C++不让您typedef
使用以前仅声明为class
orstruct
的名称吗?
还是我误解了发生了什么?
C++ 确实允许您对现有的类名进行 typedef,但只能以非常受限的方式。一旦你宣布struct S
你可以做
typedef struct S S;
但你不能做
typedef struct S *S; // ERROR
或者
typedef int S; // ERROR
在第一种情况下,您重新定义S
为指针的事实是破坏它的原因。
语言规范在 7.1.3/2 中说
在给定的非类作用域中,typedef 说明符可用于重新定义在该作用域中声明的任何类型的名称,以引用它已经引用的类型。
“已经引用”是关键部分。简而言之,您可以重新定义类名以代表相同的类类型,但不能代表指向该类类型的指针或其他任何东西。
前面提到的 C++ 标准部分也允许您编写重复的 typedef,例如
typedef int T;
typedef int T;
typedef int T;
这在 C 中是非法的。
这在 C 中是可以的,因为结构名称不会与类型名称冲突 - 结构名称是struct S
,类型名称是 just S
。但是,在 C++ 中,所有名称都被认为来自同一个名称池,因此示例中的两个名称会发生冲突。
您正在尝试定义与“S”(结构名称)冲突的 S(typedef)。