c++ - 前向声明 typedef

标签 c++ typedef

背景

我正在致力于创建与数据建模语言的 C++ 绑定(bind)。其中一部分涉及读取一组类型定义并将其转换为 C++ typedef。目前,就我而言,大约有 100 个。

问题

在我正在阅读的文件中,类型定义未以任何方式排序。因此,我最终可能会将一个类型定义为另一个尚未定义的类型。

在 C++ 中,问题基本上是这样的:

typedef typeA typeB;
typedef typeC typeA;
typedef double typeC;

很明显这行不通,但是我可以以任何方式转发声明这些吗?

一个可能的解决方案当然是我在创建 C++ 文件之前处理这些定义:

typedef double typeC;
typedef typeC typeA;
typedef typeA typeB;

但我的问题仍然是,我可以转发声明 typedef 来完成这项工作吗?

最佳答案

不,typedef 不能被前向声明。

类类型、 union 类型和(C++11 起)枚举类型可以使用 class 进行前向声明。或struct关键字,union关键字,以及 enum分别是关键字。例如

class Foo;  // forward declaration
Foo* make_foo();
class Foo {
   // ...
};

但是,即使您确定类型是类、 union 或枚举,typedef 也无法前向声明。例如,这将不起作用:

class Bar { /* ... */ };
class Foo;
typedef Bar Foo;

原因是前向声明 Foo隐式声明它与稍后 class Foo { /* ... */ }; 定义的类型相同定义,因此它与所有先前定义的类型不同,因此当您稍后说 typedef Bar Foo; 时,你这和你之前说的相矛盾。

关于c++ - 前向声明 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39991359/

相关文章:

c++ - 未在范围中声明imread(opencv-eclipse)

C++ char序列函数总是返回空字符串

c++ - 在 C++ 中为 Fortran 程序员传递多维数组

c++ - 如何使用 "using"关键字定义函数原型(prototype)/签名

c++ - Swift 中的类

c - 我无法 typedef 指向已进行 typedef 编辑的结构的指针

c++ - 如何在 C++ 中声明自引用容器?

c++ - 头文件中的 typedef vector size_type

c - typedef'ing 指针类型被认为是不好的做法吗?

c++ - C++中的数据销毁