具有可变参数模板初始化列表的多种类型的C ++操作重载

时间:2017-11-01 13:21:49

标签: c++ templates operator-overloading

你好我已经创建了一个简单的2D坐标类(Point2D),我想为一些基本类型(short,int,double ....)重载这个类的一些基本操作(+ - * /),所以我以为我应该使用模板。问题是我得到了一些strage数字(我认为这些是类型的最大大小),因为x和y值返回,因此它忽略了我的例子。

Point2D *p = new Point2D(5, 7) //everything works fine here x=5 y=7
Point2D *p = new Point2D(5, 7) + 10;//x= 1.09 * e^-38 same for y but it want x=15 and y=17

下面是我的操作重载函数的定义:

template<class T>
Point2D Point2D::operator+(initializer_list<T> elementList)
{
    for (auto elem : elementList)
    {
        this->x += elem;
        this->y += elem;
    }
    return Point2D(x,y);
}

2 个答案:

答案 0 :(得分:1)

的行为
Point2D *p = new Point2D(5, 7) + 10;

未定义。右侧被分组为(new Point2D(5, 7)) + 10,这会向sizeof(Point2D)返回的Point2D*指针添加10批new

您不能设置指向您不拥有的内存的指针,除了一个超过数组末尾的内存,或者超过标量地址的内容,或nullptr。< / p>

答案 1 :(得分:0)

您无法将10添加到类似的指针中。修复它的一种方法是简单地创建Point2D's作为局部变量:

Point2D p (5, 7);
Point2D q = p + 10;

q现在将等于15,17

假设您创建的operator+可以ints - initializer_list一个人在这里工作(因为10不是&#39 ; t initializer_list

template<class T>
Point2D Point2D::operator+(T e)
{
    x += e;
    y += e;

    return Point2D(x, y);
}