【发布时间】:2014-09-17 06:09:46
【问题描述】:
有很多关于 StackOverflow 中的 C++ 前向声明的问题,但我没有找到解决这个问题的方法。
考虑以下代码:
struct Record1; // Forward declaration.
struct Record2; // Forward declaration.
struct Record1 {int a; Record2 *r2;};
struct Record2 {int b; Record1 *r1;};
它是可编译和可用的。现在,假设我想使用元组,而不是结构。那可能吗?看来我无法避免需要对 typedef 进行某种(非法)前向声明,例如:
class Record1;
class Record2;
using Record1 = std::tuple<int, Record2*>; // No go. Conflicting declaration.
using Record2 = std::tuple<int, Record1*>; // Same here.
我尝试了几种方法,包括拼命滥用后期模板实例化,但没有成功。我会很感激任何想法。
谢谢!
【问题讨论】:
-
您试图将
class的名称别名为tuple,这不是合法的 C++ 代码。 -
我知道这是非法的(在我的帖子中是这样说的......)。但是请注意,这两个示例几乎是等效的,因此我希望由于第一个是可行的,因此第二个也是可行的。如果 std::tuple 比没有交叉引用的结构更可取,那么交叉引用仍然适用,我想使用它。
-
@Borbei no,
class Record1;forward 声明了一个类型。using Record1 = ...定义类型别名,而不是类型。 -
是的,我知道。我希望我在问题中说清楚了(显然,我没有)。我的问题很简单:如何让第一个示例使用元组而不是结构?
-
您明白
structs 只是classes,所有成员都是公开的吗?struct Record1是class类型的名称标识符。如果您声明与别名相同的标识符,编译器将如何区分类型和别名?
标签: c++ templates typedef forward-declaration cross-reference