为什么我被重新定义;不同的基本类型
Why am I getting redefinition; different basic types?
为什么我在Visual C++中尝试此操作时会出现错误?
struct S { };
typedef S *S;
C++不让你typedef
以前只声明为class
或struct
的名字吗?
还是我误解了发生了什么?
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 中是非法的。
这在
C 中是可以的,因为结构名称不会与类型名称冲突 - 结构名称将struct S
,类型名称将只是S
。但是,在C++所有名称都被视为来自同一个名称池,因此示例中的两个名称将发生冲突。
您正在尝试定义与"S"(结构名称)冲突的 S(typedef)。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 列表参数的类型定义
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 关于 C++ 中的函数类型定义
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 将使用/类型定义限制为类范围
- 模板类型定义?
- C++:模板类的类型定义
- 如何对命名空间限定类型进行类型定义?
- 此递归模板类型定义是否有效C++?
- 具有调整对齐方式的类型定义
- C++从抽象类型定义类成员
- 用于C++代码的 API 监视器类型定义 (XML)
- 如何将result_of与函数类型定义一起使用
- 在C++的适当类型定义位置
- 如何根据模板类型定义浮点常量?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 参数化类的别名(或类型定义)内部类
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?