【问题标题】:How to avoid ambiguous constructor error when providing bool and double overloads提供 bool 和 double 重载时如何避免模棱两可的构造函数错误
【发布时间】:2013-12-24 07:28:07
【问题描述】:

我正在构建一个类,其实例可以表示多种简单的值类型。它的界面大致如下:

class value {

  public:

    value();
    explicit value( double value );
    explicit value( bool value );

 ...
}

我发现我无法按照我希望的方式构造它,因为整数(一个非常常见的用例)在 bool 和 double 之间被认为是不明确的。

value bool_value( true );   // OK
value pi_approx( 3.14159 ); // OK
value int_value( 42 );      // ERROR: ambiguous constructor

有什么方法可以在不要求调用者对数值使用小数点或使用显式“make”静态函数的情况下完成这项工作?

[编辑]:此类表示来自 JSON 解析树的值,因此 bool 和 number 之间的区别很重要,必须保留。

【问题讨论】:

  • 您是否有理由不希望有一个构造函数接受 int 而只是委托给接受 double 的构造函数?
  • 参见上面的编辑:bool 和 number 之间的区别很重要,必须保留。
  • 我不确定您编辑的目的是什么。我认为布尔值和数字之间的区别已经很明显了,没有人提出其他建议。
  • @ruakh:我原本以为有人建议 bool 可以折叠成一个数字而不会失去语义。

标签: c++ constructor overloading


【解决方案1】:

你应该指出,在这种情况下它是双精度的,或者布尔值。类似的东西

value int_value(static_cast<double>(42));

或者简单地编写构造函数,它应该接收整数值。

问题是,编译器有两种构造对象的变体,一种是将整数转换为double,第二种是将整数转换为bool,没有一个比另一个更有价值,所以,编译器无法选择,没有帮助.

【讨论】:

  • 它似乎使它更透明,你需要整数构造函数,具有相当宽松的整数类型(例如long long int)。这将捕获最广泛的整数,并避免要求用户在它出现的每一点都编写丑陋的演员表。
  • 通宵思考这个问题(睡眠总是有帮助的,不是吗?),我认为我将采取的方法是命名工厂方法而不是重载的构造函数
  • 参见上面的编辑:bool 和 number 之间的区别在语义上很重要。将布尔值折叠成数字是不行的。
  • 添加一个整数构造函数没有帮助。模棱两可的构造函数错误仍然出现,这次引用所有三个构造函数(boolint64_tdouble)作为候选。
  • 至于@ForEveR 的解决方案,我不希望对这个对象的构造函数的调用者强加明确的强制转换要求。
【解决方案2】:

似乎不可能让编译器以我希望的方式自动消除构造函数的歧义。

我已经通过使用工厂方法解决了这个问题:

class value {
  public:
    static value from_double( double value );
    static value from_int64( int64_t value );
    static value from_bool( bool value );
  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多