为什么我在Visual C ++中尝试这个时出错?
struct S { };
typedef S *S;
不是C ++ let you typedef
a name that was previously only declared as a class
or struct
吗?
或者我误解了发生了什么?
答案 0 :(得分:5)
C ++允许您键入现有的类名,但只能以非常有限的方式。一旦你宣布了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中是非法的。
答案 1 :(得分:1)
这在C中是可以的,因为结构名称不会与类型名称冲突 - 结构名称将是struct S
,类型名称将只是S
。但是,在C ++中,所有名称都被认为来自同一个名称池,因此示例中的两个名称将发生冲突。
答案 2 :(得分:0)
您正在尝试定义与“S”(结构名称)冲突的S(typedef)。