vector<double> add(vector<double> v1, vector<double> v2 )
Из сообщения об ошибке я могу с уверенностью сказать, что это не сигнатура функции в вашем исходном коде.
В исходном коде вы должны использовать это:
vector<double> add(vector<double> & v1, vector<double> & v2 )
Если это так, сделайте его следующим образом:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
Теперь все должно работать нормально.
Объяснение:
Возвращаемое значение add()
является временным объектом, и временный объект не может быть привязан к неконстантной ссылке.Вот почему компилятор выдавал ошибку.Это даст ту же ошибку, если вы напишите это:
vector<double> & v = add(a,b); //error
Однако, если временный объект может быть связан со ссылкой const
.Вот почему я предложил вам сделать ссылку на параметр const
.Это означает, что вы можете написать это:
const vector<double> & v = add(a,b); //ok
Также вы можете сделать параметр неконстантным, а также не ссылочным, то есть передать аргументы по значению .Но я бы не советовал, так как это включает ненужных копий векторов.
Лучшее решение таково:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
Знакомство с оператором +
Вы также можете перегрузить 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
Isnне правда ли?
Знакомство со стандартным алгоритмом ..
Как прокомментировал @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;
}