添加载体c ++。无法理解编译错误

时间:2011-09-22 18:48:43

标签: c++ vector

您好我已经写了以下添加2个矢量的功能

vector<double> add(vector<double>& v1, vector<double>& v2 )

{  /*Do quick size check on vectors before proceeding*/

  vector<double> result(v1.size());
  for (unsigned int i = 0; i < result.size(); ++i)
  {
    result[i]=v1[i]+v2[i];
  }

  return result;

}

现在我尝试在以下两种方式中添加3个矢量a,b,c全部大小相同

vector <double> sum1, sum2;

sum1=add(b,c);

sum2=add(a,sum1); 

哪个有效

vector <double> sum;
sum=add(a,add(b,c));

给了我以下编译器错误

g++ -Wall simple.cpp 
simple.cpp: In function ‘int main(int, char**)’:
simple.cpp:45: error: invalid initialization of non-const reference of type ‘std::vector<double, std::allocator<double> >&’ from a temporary of type ‘std::vector<double, std::allocator<double> >’
simple.cpp:16: error: in passing argument 2 of ‘std::vector<double, std::allocator<double> > add(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’

为什么第二种方法不起作用?

2 个答案:

答案 0 :(得分:7)

vector<double> add(vector<double> v1, vector<double> v2 )

从错误消息中,我可以100%肯定地说这不是原始代码中的函数签名。

在原始代码中,您必须使用此代码:

vector<double> add(vector<double> & v1, vector<double>  & v2 )

如果是,请将其设为:

vector<double> add(const vector<double> & v1, const vector<double>  & v2)

现在它应该可以正常工作。

说明:

add()的返回值是临时对象,临时对象不能绑定到非const 引用。这就是编译器给出错误的原因。如果你这样写,它会给出同样的错误:

vector<double> & v = add(a,b); //error 

但是,如果临时对象可以绑定到const引用。这就是为什么我建议你做参数const参考。这意味着,你可以这样写:

const vector<double> & v = add(a,b); //ok

此外,您还可以使参数非const非引用,即通过 value 传递参数。但我不建议这样做,因为它涉及载体的不必要的副本

最好的解决方案是:

vector<double> add(const vector<double> & v1, const vector<double>  & v2)

熟悉operator +

你也可以为vector重载operator+,如下:

vector<double> operator + (const vector<double>& v1, const vector<double>& v2 )
{  
  /*Do quick size check on vectors before proceeding*/
  vector<double> result(v1.size());
  for (unsigned int i = 0; i < result.size(); ++i)
  {
    result[i]=v1[i]+v2[i];
  }
  return result;
}

如果你重载这个,那么你可以编写这个很酷的代码:

vector<double> c = a + b;
vector<double> d = a + b + c;
vector<double> e = a + b + c + d;
//so on

不是很有趣吗?

熟悉标准算法..

正如@Gene评论的那样,您可以在函数中使用std::transform

vector<double> operator+(const vector<double>& v1, const vector<double>& v2 )
{  
   vector<double> result;
   std::transform(v1.begin(),v1.end(),v2.begin(), 
                            std::back_inserter(result), std::plus<double>);
   return result;
}

答案 1 :(得分:0)

vector<double> add(vector<double>& v1, vector<double>& v2 )

因为我们希望函数修改它的参数,所以我们不能用任何表达式调用该函数。相反,我们必须将lvalue参数传递给引用参数。左值是表示非临时对象的值。

sum=add(a,add(b,c));

上一次添加调用尝试传递临时对象。