Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost数据类型的继承_C++_Inheritance_Boost_Ambiguous_Mpfr - Fatal编程技术网

C++ boost数据类型的继承

C++ boost数据类型的继承,c++,inheritance,boost,ambiguous,mpfr,C++,Inheritance,Boost,Ambiguous,Mpfr,这可能是XY问题,因此我将把原始情况放到上下文中: 我正在编写一些用于数据类型的模板化代码:double、boost::mpfr、boost::mpfi、boost::interval。对于这些数据类型中的大多数,boost提供了一个非常相似的接口,但也有一些不同之处。我要处理的最具挑战性的区别是,我想在这些类型之间的转换中指定细节(例如,boost::mpfr通常舍入到最近的值,但是对于boost::mpfr和boost::interval之间的转换,我需要使用后端并指定舍入方案) 我考虑的解

这可能是XY问题,因此我将把原始情况放到上下文中:

我正在编写一些用于数据类型的模板化代码:double、boost::mpfr、boost::mpfi、boost::interval。对于这些数据类型中的大多数,boost提供了一个非常相似的接口,但也有一些不同之处。我要处理的最具挑战性的区别是,我想在这些类型之间的转换中指定细节(例如,boost::mpfr通常舍入到最近的值,但是对于boost::mpfr和boost::interval之间的转换,我需要使用后端并指定舍入方案)

我考虑的解决方案是使用继承和赋值/显式转换。代码的开头如下所示:

#include<iostream>
#include<boost/multiprecision/mpfr.hpp>

using namespace boost::multiprecision;

class mpfr : public mpfr_float{
public:
    mpfr() : mpfr_float(0) {}

    template<typename Number>
    mpfr(Number val=0) : mpfr_float(val) {}};

int main(){
    mpfr val1=2.3,val2=3.4;
    val1+val2;
    return 0;}
#包括
#包括
使用名称空间boost::multiprecision;
mpfr类:公共mpfr\U浮动{
公众:
mpfr():mpfr_float(0){}
模板
mpfr(Number val=0):mpfr_float(val){};
int main(){
mpfr val1=2.3,val2=3.4;
val1+val2;
返回0;}
当我试图编译这个时,我得到了一个带有以下三个选项的模糊调用错误(来自boost/multiprecision/detail/et_ops.hpp):

一,

模板
内联细节::表达式
操作员+(常数编号和a、常数编号和b)
二,

模板
内联typename启用_if::type
操作员+(常数编号和a、常数V和b)
三,

模板
内联typename启用_if::type
操作员+(常数V&a、常数编号和b)
在这一切之后,我有以下两个问题:

  • 这是否是XY问题,即是否有更好的选择

  • 如果这是一个合理的解决方案,是否有一个简单的方法来避免歧义错误


  • 为什么不创建自己的四舍五入函数,该函数为您想要支持的所有类型提供重载,并具有正确的语义?您能建议一种在数字类型之间转换的统一方法吗?mpfr在mpfr.hpp中硬编码了舍入规则,那么我需要重写多少boost_mpfr?我不确定。你还没有明确指出做出了哪些选择(以及为什么它们不适合你)。所以,如果你已经知道了,我就留给你了。那不是。。。实际上是一个编程错误,而不是一个功能性的决定。但是,如果您发现Boost的mpfr后端的设计对开发人员来说是一个负担(因为他们会做出任意选择),请向Boost Multiprecision的维护人员提出改进建议
    template <class B>
    inline detail::expression<detail::add_immediates, number<B, et_on>, number<B, et_on> >
    operator + (const number<B, et_on>& a, const number<B, et_on>& b)
    
     template <class B, class V>
     inline typename enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >, detail::expression<detail::add_immediates, number<B, et_on>, V > >::type
     operator + (const number<B, et_on>& a, const V& b)
    
     template <class V, class B>
     inline typename enable_if<is_compatible_arithmetic_type<V, number<B, et_on> >, detail::expression<detail::add_immediates, V, number<B, et_on> > >::type
     operator + (const V& a, const number<B, et_on>& b)