C++ 返回带有重载运算符的不可访问地址的指针+;

C++ 返回带有重载运算符的不可访问地址的指针+;,c++,C++,我发现了很多关于这个错误的讨论,但是到目前为止我还没有尝试过任何方法 基本上,我是使用动态数组创建一个templater向量类,但是当我尝试重载“+”操作符时,它只适用于2个加数(v3=v1+v2),当我尝试3个加数(v4=v1+v2+v3)时,它返回最后一个加数(v3)。我发现这是因为当重载+运算符的函数被第二次调用时,第一个加数的指针的值为0xCCCC。这意味着它可能指向了一些不复存在的东西。但是,我不知道如何从重载函数返回向量对象。这是我尝试过的,但没有一个有效: //this works

我发现了很多关于这个错误的讨论,但是到目前为止我还没有尝试过任何方法

基本上,我是使用动态数组创建一个templater向量类,但是当我尝试重载“+”操作符时,它只适用于2个加数(v3=v1+v2),当我尝试3个加数(v4=v1+v2+v3)时,它返回最后一个加数(v3)。我发现这是因为当重载+运算符的函数被第二次调用时,第一个加数的指针的值为0xCCCC。这意味着它可能指向了一些不复存在的东西。但是,我不知道如何从重载函数返回向量对象。这是我尝试过的,但没有一个有效:

//this works only for two addends
template <class T> Vector<T>& operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T> v;
    //calculations
    return v;
};

//this causes above mentioned error
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T> v;
    //calculations
    return v;
};

//this causes above mentioned error too
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T>* v= new Vector<T>;
    //calculations
    return (*v);
};
//这只适用于两个加法器
模板向量和运算符+(向量和v1、向量和v2)
{
向量v;
//计算
返回v;
};
//这会导致上述错误
模板向量运算符+(向量和v1,向量和v2)
{
向量v;
//计算
返回v;
};
//这也会导致上述错误
模板向量运算符+(向量和v1,向量和v2)
{
向量*v=新向量;
//计算
返回(*v);
};

你知道如何返回vector object以便它也可以使用3个加数吗?

你需要使用
const
引用,以便它们可以绑定到临时变量:

template <class T> 
Vector<T> operator+(const Vector<T>& v1, const Vector<T>& v2)
{
  Vector<T> tmp = v1;
  tmp += v2;
  return tmp;
}
模板
向量运算符+(常量向量和v1,常量向量和v2)
{
向量tmp=v1;
tmp+=v2;
返回tmp;
}
如果您的类型可以有效地移动,则可以使用右值引用来利用:

template <class T> 
Vector<T> operator+(Vector<T>&& v1, Vector<T>&& v2)
{
  Vector<T> tmp = std::move(v1);
  tmp += v2;
  return tmp;
}
模板
向量运算符+(向量和v1,向量和v2)
{
向量tmp=std::move(v1);
tmp+=v2;
返回tmp;
}

显然,您不应该返回引用或需要调用者删除的内容。

第一个版本总是坏掉的(返回对局部变量的引用,未定义的行为),第三个版本是坏掉的,因为它要求调用者删除返回值,第二个版本几乎可以,但是需要
const
参考参数。哦,是的,它需要在我的类中进行一些修改,因为我几乎没有在任何地方使用过“const”。谢谢