代码之家  ›  专栏  ›  技术社区  ›  Brannon

让赋值运算符在申报时工作

  •  1
  • Brannon  · 技术社区  · 7 年前

    我试图创建一个不变的Angle类(如下所示)。 Angle z = 42; 不起作用。我如何让它工作?示例:

      Angle a(1); // works
      Angle b; b = 2; // works
      Angle c {25}; // works
      Angle d {26.0}; // works
      Angle e = 27.0; // doesn't compile -- why not?
      auto f = Angle(28.0); // works
    

    资料来源:

      class Angle {
          double _angle;
    
        public:
          explicit Angle(double value) noexcept : _angle(wrap0To2Pi(value)) {}
          Angle() = default;
          Angle(const Angle& angle) noexcept : _angle(angle._angle) {}
          Angle(const Angle&& angle) noexcept : _angle(angle._angle) {}
    
          operator double() const { return _angle; }
    
          Angle& operator=(const Angle& f) noexcept { _angle = f._angle; return *this; }
          Angle& operator=(double t) { _angle = wrap0To2Pi(t); return *this; }
    
          Angle operator+(Angle value) const { return Angle(_angle + value._angle); }
          Angle operator-(Angle value) const { return Angle(_angle - value._angle); }
          Angle operator*(Angle value) const { return Angle(_angle * value._angle); }
    
          constexpr static double DEFAULT_ANGLE_TOLERANCE = 0.0001;
          bool equals(Angle value, double tolerance = DEFAULT_ANGLE_TOLERANCE) const; // needs to wrap
    
          bool operator==(Angle value) const { return equals(value); }
          bool operator!=(Angle value) const { return !equals(value); }
          ...
    

    这里还有什么我该换的吗?谢谢你的时间。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Brian Bi    7 年前

    在形式的定义中

    Angle e = 27.0;
    

    只有初始化,没有赋值。这将尝试调用的构造函数 Angle 这将接受 double 论点但是,由于您已标记 Angle(double) 建造师 explicit ,则无法使用此语法执行此转换。

    如果要使其正常工作,请删除 明确的 关键字。