【问题标题】:is typedef type of derived type considered as derived type of a typedef type of corresponding base type是派生类型的 typedef 类型,被认为是相应基类型的 typedef 类型的派生类型
【发布时间】:2019-04-24 21:43:09
【问题描述】:

我有以下代码:

// Assumption: Base is the base class of Derived

typedef msm::back::state_machine<Base>  SM_Base;
typedef msm::back::state_machine<Derived>  SM_Derived;

那么SM_DerivedSM_Base 的子类型,我可以做所有常规的多态操作吗?

【问题讨论】:

  • 我看了你的标题3遍还是没看懂...问题好多了:)
  • @lago 我知道,我真的不知道如何用一句话来形容这个问题..
  • 顺便说一句,这可以通过编译器的工作方式来回答。它最初会读取您的代码并将所有 typedef 替换为其原始类型,从而继续编译代码。因此,如果Derived 最初是Base 的子类型,那么SM_Derived 将是SM_Base 的子类型
  • @lago 但是当我执行std::weak_ptr&lt;SM_Base&gt; m_sm = sm //(sm is a std::shared_ptr&lt;SM_Derived&gt; ) 时,编译器会抛出错误no match operator =。这是为什么呢?
  • 哦,模板在 C++ 中是不变的。我不记得了...对不起:(但是,有一个技巧可以解决此错误:cpptruths.blogspot.com/2015/11/…

标签: c++ boost


【解决方案1】:

通过typedef(或using)引入新名称不会影响类型之间的关系。

因此,问题是msm::back::state_machine&lt;Derived&gt; 是否是msm::back::state_machine&lt;Base&gt; 的子类型。

事实并非如此。

你也可以用一点点代码轻松地检查这些事情:

#include <iostream>
#include <type_traits>

int main() {
    std::cout << std::is_base_of<SM_Base, SM_Derived>::value;
}

【讨论】:

    【解决方案2】:

    没有。此属性称为covariance,而 C++ 模板参数没有它(即它们是不变的)。

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 2018-07-31
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多