【问题标题】:static_cast compiler error from derived reference to base reference从派生引用到基引用的 static_cast 编译器错误
【发布时间】:2013-06-26 02:52:56
【问题描述】:

在我最近发布的一个问题 (C++: Bad Form to Call Base Class Asssignment Operator in Derived Class Constructor?) 的 cmets 中,我遇到了另一个关于如何使用 static_cast 从派生类型转换为基类型的问题。可以在此处找到该问题的支持文档:Why does static_cast(*this) to a base class create a temporary copy?

我的主要问题是我现在使用 static_cast 将其转换为派生类中的基类没有问题。但是,我无法执行从派生引用到基引用的静态转换。我只在派生类的相等运算符中这样做。问题来了:

bool Derived::operator==(const Derived& other_derived) {
  // first call the operator == from the base class...
  if (static_cast<Base&>(*this) == static_cast<Base&>(other_derived)) {
    // continue checks for derived member variables
  }
}

编译器对上面的 if 语句大喊大叫。 this 的 static_cast 没有问题,但无法将派生类的 static_cast 解释为基类。如果我删除引用,这编译得很好,但如两个引用的问题所示,这将不必要地创建一个临时对象。

因此,我想知道我是否缺少从派生类到基类的构造函数。我会在哪里编写这样的构造函数(因为它是基类型的构造函数)?我认为在基类的源代码中这样做是没有意义的,因为这不是本质上使基类自定义并破坏了可重用代码的精神吗?

一个更简单的选择是只接受在此函数中临时创建对象,但该函数最终可能会被频繁调用,因此我不确定是否可以接受性能损失。

还有什么我应该考虑的遗漏吗?与往常一样,提前感谢您的帮助。

【问题讨论】:

  • 也许你的平等基类实现是一个const 函数(应该是)?在这种情况下,您也应该将派生类设为 const,并强制转换为 const Base &amp;
  • 嗯,实际上,这并不能解释编译器错误。你到底遇到了什么错误?
  • 你解决了!见下文!

标签: c++ inheritance g++ operator-overloading static-cast


【解决方案1】:

所有功劳归于@jogojapan。派生类和基类中的 operator== 从未定义/声明为 const。将所有等式和不等式运算符更改为 const 函数会产生程序编译。此外,我必须稍微更改 static_cast 语法以转换为 const 类型。那就是:

static_case<const Base&>(derived_object);

再次感谢您的帮助!

【讨论】:

  • 是的,对,我最初的评论实际上是正确的,除了错误消息本身必须提到other_derived(标记为const)的无效转换,而不是@987654324 @。无论如何,确实,所有这些都应该标记为const,以便进行相等比较。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多