【问题标题】:Forward declarations and cross-referencing in tuples元组中的前向声明和交叉引用
【发布时间】: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 Record1class 类型的名称标识符。如果您声明与别名相同的标识符,编译器将如何区分类型和别名?

标签: c++ templates typedef forward-declaration cross-reference


【解决方案1】:

滥用公共继承是获得你想要的东西的一种方式:

#include <iostream>
#include <tuple>

class Record1;
class Record2;

class Record1: public std::tuple<int, Record2*> { using base = std::tuple<int, Record2*>; using base::base; };
class Record2: public std::tuple<int, Record1*> { using base = std::tuple<int, Record1*>; using base::base; };

int main() 
{
    Record1 r1 = std::make_tuple(0, nullptr);        
    std::cout << (std::get<0>(r1) == 0) << (std::get<1>(r1) == nullptr);
}

Live Example.

【讨论】:

  • 谢谢!但我认为那些 Record1 和 Record2 类实际上不能用作元组,如果没有一些额外的包装会使这个解决方案不方便。例如,“Record1 r1 = std::make_tuple(0, nullptr);”不会工作。
  • @Borbei 只需添加一个 typedef 来声明基类,然后使用继承构造函数,一切就绪。查看更新的答案。
  • 我使用的编译器不支持构造函数继承,但您的解决方案似乎是完整的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多