【问题标题】:C++ multiple conversion operatorsC++ 多转换运算符
【发布时间】:2020-06-17 09:09:02
【问题描述】:

我用两个成员变量和两个转换运算符(运算符 float 和 operator chrono::microseconds)定义了一个如下所示的类。但是下面的代码只有在我注释掉浮点运算符时才有效。否则,它会引发错误(无法转换类型)。我想不通为什么?

#include <iostream>
#include <chrono>

using namespace std::chrono_literals;

class Peak {
public:
  Peak (std::chrono::microseconds t, float magnitude)
  : t_(t),
    magnitude_(magnitude)
  {
  };

  std::chrono::microseconds get_t() { return t_; }
  //have to comment this out or I get an error
  operator float() { return magnitude_; }
  operator std::chrono::microseconds() {
      return t_;
  }
private:
  std::chrono::microseconds t_{2us};
  float magnitude_;
};

int main()
{
  Peak a{3us, 100};
  std::cout
    << "t is "
    << static_cast<std::chrono::microseconds>(a).count();
}

【问题讨论】:

  • 我可以在这里看到错误:cpp.sh/9c3cb
  • 好像和gcc有关。在编译器资源管理器中,如果我选择 gcc 7.3 我会看到错误但 7.4 没有显示错误
  • 根本不是答案或解雇,因为我认为问题很有趣,但这是一个非常糟糕的设计,而不是应该如何使用运算符。对于两个自变量,您应该为每个变量使用不同的吸气剂。操作员都应该按照人们通常期望的方式行事。在这里产生任何类型的标量值的元组强制转换操作是不明智的。人们会期望转换是将相同值的对话转换为不同的类型,但您只是返回两个不相关的值。我会说你在滥用 operator();尽管如此有趣的问题和发现。

标签: c++ operator-overloading operator-keyword


【解决方案1】:

看起来像 GCC 7.3 和更早版本中的编译器错误。似乎正在使用-std=c++17 标志构建解决方法。或者,使float 转换运算符explicit 也可以修复它:

explicit operator float() const { return magnitude_; }

(顺便说一句,标记这些const 总是一个好主意。)

更新:

实际上,只需将这些运算符设置为const 似乎已经修复了它,而无需将float 设置为一个explicit,也无需使用-std=c++17 进行构建。

【讨论】:

  • 他没有在内部修改他的类,所以他应该明确地将它们标记为 const。当然,为什么要解决问题超出了我的范围。显式在这里肯定是有帮助的。但是他尝试一个字符是什么?似乎模棱两可。我想c++返回类型推导起了作用
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
相关资源
最近更新 更多