在基于模板的类中重载赋值运算符

时间:2015-06-15 08:13:44

标签: c++ templates type-conversion operator-overloading template-meta-programming

我正在编写一个库来支持一种具有两个模板参数INT_BITSFRAC_BITS的整数。我成功地编写了一个转换函数来将不同的类类型从一个转换为另一个类型[INT_BITSFRAC_BITS的值不同。但是当我尝试在赋值运算符的重载中使用它时它不起作用。请建议我实现它的方法。我已经浏览了here herehere链接,但解决方案似乎都没有。

班级定义:

template<int INT_BITS, int FRAC_BITS>
struct fp_int
{
public:
    static const int BIT_LENGTH = INT_BITS + FRAC_BITS; 
    static const int FRAC_BITS_LENGTH = FRAC_BITS;

private:
    ValueType stored_val;
};

转换函数定义:

template <int INT_BITS_NEW, int FRAC_BITS_NEW>
fp_int<INT_BITS_NEW, FRAC_BITS_NEW> convert() const
{
    typedef typename fp_int<INT_BITS_NEW, FRAC_BITS_NEW>::ValueType TargetValueType;

    return fp_int<INT_BITS_NEW, FRAC_BITS_NEW>::createRaw(
        CONVERT_FIXED_POINT<
            ValueType,
            TargetValueType,
            (FRAC_BITS_NEW - FRAC_BITS),
            (FRAC_BITS_NEW > FRAC_BITS)
            >:: exec(stored_val));
}

运营商定义如下:

template <int INT_BITS_NEW, int FRAC_BITS_NEW>
fp_int<INT_BITS_NEW, FRAC_BITS_NEW>
    operator =(fp_int<INT_BITS,FRAC_BITS> value) const
{
     fp_int<INT_BITS_NEW,FRAC_BITS_NEW> a = value.convert<INT_BITS_NEW,FRAC_BITS_NEW>();
     return a;
}

当我尝试这个时它起作用:

fp_int<8,8> a = 12.4;
fp_int<4,4> b = a.convert<4,4>();

但是当我尝试这个时,它会显示类型转换错误:

fp_int<8,8> a = 12.4;
fp_int<4,4> b;
b = a;

请告诉我哪里出错了。

1 个答案:

答案 0 :(得分:1)

让我们说你正在使用正常的课程,而不是模板。您有一个类SomeType,并且您希望为此类设置赋值运算符,以便可以将类型为OtherType的对象分配给此类的对象。所以像这样:

SomeType obj1;
OtherType obj2;
obj1 = obj;

为此,你可以编写SomeType的赋值运算符,如下所示:

SomeType& operator=(const OtherType& other)
{
    // implementation...

    return *this;
}

将此转换为模板,SomeTypeOtherType是同一模板类的实例,但具有不同的模板参数。 在这种情况下,SomeType变为fp_int<INT_BITS, FRAC_BITS>OtherType变为fp_int<DIFFERENT_INT_BITS, DIFFERENT_FRAC_BITS>

所以你的运营商应该是这样的:

template <int DIFFERENT_INT_BITS, int DIFFERENT_FRAC_BITS>
fp_int<INT_BITS, FRAC_BITS>&
    operator =(fp_int<DIFFERENT_INT_BITS, DIFFERENT_FRAC_BITS> value)
{
    // proper implementation for an assignment operator
}

将上面的模板参数与示例中的模板参数进行比较,以查看差异。基本上你是在尝试以错误的方向进行转换,这就是为什么你得到关于类型转换的编译错误。