【问题标题】:How can I forward declare a type I'm going to create with typedef?如何转发声明要使用 typedef 创建的类型?
【发布时间】:2016-08-22 19:46:21
【问题描述】:

例如,拿这个sn-p的代码:

class Foo;
class Something {
    Foo *thing;
};
typedef std::vector<Something> Foo;

这不会编译,因为Footypedef 被命中时已经是一个类型。但是,我认为它显示了我的用例;我有周期性的依赖关系,需要一个来实现另一个,但是(目前)其中一件事是 typedef 的。我不想写类似的东西

class Foo {
    std::vector<Something> inside;
}

因为我需要记住每个my_foo.inside.some_method() 中的inside。我还想避免在 std::vector&lt;Something&gt; 周围编写包装器,因为它会是很多样板。

我如何转发声明我使用 typedef 定义的类型? 或者,我如何解决我的循环依赖问题没有使用其中之一上面的解决方案?有可能吗?

请注意,我不是在问“我如何typedef 使用尚未声明的类型”。我在问“我如何使用typedef 来定义先前声明的类型”。

【问题讨论】:

  • 如果有任何术语被关闭,我们深表歉意。我从来没有真正学会它。请随时纠正我或质疑似乎错误的假设。
  • typedef Foo; 也许
  • @Jean-FrançoisFabre IIRC 这是一个编译错误
  • @Jean-FrançoisFabre 嗯??
  • 建议更一致/和谐的代码;忘记typedef,使用using - using Foo = std::vector&lt;Something&gt;;。对您的问题没有帮助,只是想提一下;-)

标签: c++ typedef forward-declaration


【解决方案1】:

转而声明类:

class Something;
typedef std::vector<Something> Foo;
class Something { Foo *thing; };

如果您使用的是 C++11 或更高版本,请使用 using 声明代替 typedef

class Something;
using Foo = std::vector<Something>;
class Something { Foo *thing; };

仅此而已。

【讨论】:

  • ...哦。呃。我很聪明。
  • 使用using 而非typedef 有什么特别的原因吗?我知道当你想使用模板化昵称时很重要,但这里不是这样。
  • @QPaysTaxes 我会说因为我们生活在 2016 年,但作为声明,我也更清楚。
  • stackoverflow.com/questions/10747810/… - 而且,看起来更类似于 using namespace foo;using foo::bar; - 很高兴保留一个关键字 :)
  • @MarkB 哦,我明白了。这实际上不是用例。我实际上是在引用 typedef'd 类型(原因不止于此),所以一切都解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多