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

问题描述 投票:1回答:2

您好我已经创建了一个简单的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);
}
c++ templates operator-overloading
2个回答
1
投票

的行为

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

未定义。右手边被分组为(new Point2D(5, 7)) + 10,它正在向sizeof(Point2D)返回的Point2D*指针添加10个new

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


0
投票

你不能将10添加到这样的指针。修复它的一种方法是简单地创建Point2D's作为局部变量:

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

q现在将等于15,17

这是假设你创建一个可以采取operator+ints - 你的initializer_list将不会在这里工作(因为10不是initializer_list

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

    return Point2D(x, y);
}
© www.soinside.com 2019 - 2024. All rights reserved.