【问题标题】:Assigning a non-pointer to a pointer? (Subclassing a pointer type in C++?)将非指针分配给指针? (在 C++ 中继承指针类型?)
【发布时间】:2016-03-03 01:09:56
【问题描述】:

最近我遇到了一些看起来像这样的代码:

Foo<SomeType> member;
...
void SomeFunc(Bar* bar);
...
SomeFunc(member);

我发现它非常混乱。有人能解释一下这里到底发生了什么吗?

member 如何是有效的Bar*

Foo&lt;SomeType&gt; 是否以某种方式子类化指针类型?

这是模板的一些属性吗?如果memberFoo 而不是Foo&lt;SomeType&gt;,还有可能吗?

【问题讨论】:

  • 您需要提供Foo&lt;SomeType&gt; 的定义以获得准确的答案。也许它有一个隐式转换。
  • 你确定某处没有void SomeFunc(Foo&lt;SomeType&gt; foo);吗?

标签: c++ function templates pointers types


【解决方案1】:

会员如何成为有效的酒吧*?

一种可能性是Foo&lt;SomeType&gt; 可以转换为Bar*。这可以通过在Foo&lt;SomeType&gt; 中添加user-defined conversion operator 来实现。但我认为此类操作返回的Bar 指针没有任何意义。也许,如果 Foo&lt;SomeType&gt; 继承 Bar 并且转换运算符返回 this 它可能会做一些有意义的事情,但这将是多余的和令人困惑的。

Foo 是否以某种方式子类化指针类型?

没有。您不能继承基本类型。指针是基本类型。

这是模板的一些属性吗?

没有。

如果成员是Foo 而不是Foo&lt;SomeType&gt;,是否还有可能?

没有。类模板的实例是类。 Foo&lt;SomeType&gt; 是一个类。这不是Foo。变量不能有模板作为类型。

【讨论】:

  • “这可以通过一个转换构造函数来实现”。这是相反的方式。转换构造函数使其可其他类型转换。
  • 感谢您的回复,转换构造函数正是我想要的。为了澄清最后一个问题,我应该写“如果member 是一些Baz 而不是Foo&lt;SomeType&gt;”来澄清我想知道,如果模板和这种行为之间确实存在联系,如果它是可能没有模板。无论如何,感谢您的及时回复!
  • @n.m.是的,我最初错误地认为转换是从Bar*Foo&lt;SomeType&gt;,但是当我修复它时,忘记了它会影响我的答案。
  • @Solicasus 请注意,我的回答中有一个错误,现在已修复。这只能通过Foo&lt;SomeType&gt; 中的转换运算符来实现。
猜你喜欢
  • 1970-01-01
  • 2013-12-10
  • 2021-09-09
  • 2019-08-28
  • 1970-01-01
  • 2011-02-11
  • 2014-05-13
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多