【问题标题】:Circular reference of templates in C++C++中模板的循环引用
【发布时间】:2021-08-28 16:30:00
【问题描述】:

在 C# 中考虑这样的事情:

class C<T> {}
class D : C<E> {}
class E : C<D> {}

在 C++ 中是否可以使用模板进行等效构造?

【问题讨论】:

  • 我的意思不是翻译一种语言。我只使用 C# 来表达一个想法。我使用 C# 是因为我的思维过程就是这样进行的,而且至少有些相关。我可以用任意伪代码提出相同的想法,例如let a = { let b = b }; let b = { let a = a };。无论如何,here's the new question

标签: c++ templates code-translation


【解决方案1】:

是的,你可以转发声明E

template <typename T> class C {};

class E;
class D : public C<E> {};
class E : public C<D> {};

或者,按照弗兰克斯的建议:

template <typename T> class C {};

class D : public C<class E> {};
class E : public C<D> {};

这是否适用于您的实际情况取决于C 是否要求T 是完整的(在这个精简的示例中不需要)。

PS:我不懂 C#,所以我不确定你想要私有继承还是公共继承。以上使用公共继承,而使用关键字class 声明的类的默认值是私有继承。

【讨论】:

  • 也可以在模板参数中内联前向声明:class D : C&lt;class E&gt; {};
  • 您可能还希望 C++ 中类的公共继承(除非 OP 的 C# 示例也是私有继承?我不确定,我从未使用过 C#)。
  • 同意这是风格问题。我个人喜欢它,因为它明确表明该类型不完整。与可能会或可能不会从完整类型继承的常规模板不同,具体取决于标题中的内容。
  • @markonius 总的来说,我对在写完答案后更改问题有点迂腐(不仅因为这是我的答案),但我承认当我写这篇文章时我知道还有更多事情要做回答,否则我可能只是作为这个副本的副本关闭:stackoverflow.com/questions/4757565/…。我没有这样做,因为我知道您的问题缺少一些细节。没关系,写好问题很困难(实际上写答案要容易得多)。问题只是我离开钥匙有一段时间了。
  • @markonius 没有理由不将其作为重复项关闭。因重复而关闭的问题与被删除的问题不同。通常重复为未来的读者提供了很好的切入点,尽管答案只需要在一个地方。这里的这个答案真的不会增加你在其他地方已经找到的答案
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多