【问题标题】:C++ angled brackets (templates) followed by double colonC++ 尖括号(模板)后跟双冒号
【发布时间】:2021-09-14 18:10:18
【问题描述】:

我正在查看以下代码:

template <typename T, typename Tag>
class __attribute__((trivial_abi)) OSTaggedSharedPtr: public libkern::intrusive_shared_ptr<T, intrusive_tagged_osobject_retainer<Tag> > {
    using libkern::intrusive_shared_ptr<T, intrusive_tagged_osobject_retainer<Tag> >::intrusive_shared_ptr;
};

我知道有一个新类 OSTaggedSharedPtr 继承自 libkern::instrusive_shared_ptr。我不确定继承后的模板是做什么的,特别是这部分:&lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt;。 同样的混淆也适用于使用 lib kern::intrusive_shared_ptr 模板,特别是 &lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt;。我很确定这个问题已经得到解答,但我在 google 中找不到该问题的正确措辞,很抱歉。

【问题讨论】:

标签: c++ templates inheritance


【解决方案1】:

我知道有一个新类 OSTaggedSharedPtr 继承自 libkern::instrusive_shared_ptr

不完全是。看起来libkern::instrusive_shared_ptr 是一个模板,而不是一个类,所以你描述的继承是不可能的。相反,继承来自使用模板参数Tintrusive_tagged_osobject_retainer&lt;Tag&gt; 实例化模板所产生的类。也就是说,继承自libkern::instrusive_shared_ptr&lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt;(完整的表达式;不要试图砍掉尖括号分隔的部分)。

为了使这更复杂(但更易于使用),OSTaggedSharedPtr 也是一个模板,而不是一个类。当 OSTaggedSharedPtr 被实例化时,需要两个模板参数,TTag。所以对这种场景更准确的描述是有一个新的类族OSTaggedSharedPtr&lt;T,Tag&gt;,每个类都继承自对应的libkern::instrusive_shared_ptr&lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt;

示例

libkern::instrusive_shared_ptr 是一个模板,而
libkern::instrusive_shared_ptr&lt;int, intrusive_tagged_osobject_retainer&lt;int&gt; &gt; 是一个通过模板定义的类。

OSTaggedSharedPtr 是一个模板,而
OSTaggedSharedPtr&lt;int, int&gt; 是从该模板生成的一个类,该类继承自上例中的类 (libkern::instrusive_shared_ptr&lt;int, intrusive_tagged_osobject_retainer&lt;int&gt; &gt;)。

【讨论】:

  • 对不起,我删除了我上次说 libkern::intrusive_shared_ptr 是一个模板类的评论,你是对的,它实际上是一个定义了一些变量、函数和类的结构
【解决方案2】:

我不确定继承后的模板是做什么的,特别是这部分:&lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt;

您已经了解OSTaggedSharedPtr 继承自libkern::intrusive_shared_ptr。到目前为止,一切顺利。

现在libkern::intrusive_shared_ptr 本身就是一个模板类,也是&lt;T, intrusive_tagged_osobject_retainer&lt;Tag&gt; &gt; 部分是libkern::intrusive_shared_ptr 的模板参数。为了使事情变得更复杂,这些反过来也包含一个模板。 intrusive_tagged_osobject_retainer 是模板参数Tag 的模板。

现在我们也知道templates can be template parameters

您的代码 sn-p 基本上到处都有模板。一开始可能会有点混乱,但这在 C++ 代码中并不罕见,例如。 G。在 STL 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2021-11-06
    相关资源
    最近更新 更多