Хорошо, я пытаюсь выяснить эту ошибку и до сих пор не повезло. Я делаю это для домашней работы, поэтому я не использую включенные классы.
Вот соответствующий код:
//Will return an array where each element is the sum of the respective sums in the added arrays
Vec& Vec::operator+(Vec& v2) const{
Vec ret();
if(mySize>0){
Vec ret(mySize);
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}
И из файла .h …:
Vec& operator+ (Vec& v2) const;
Это выдает ошибку: «неверная инициализация неконстантной ссылки типа‘ Vec&’Из значения типа« Vec (*) () »« Я совершенно новичок в C ++, поэтому любая помощь будет принята с благодарностью.
Vec ret();
Принимается как прямое объявление функции, которая не принимает аргументов и возвращает Vec
, Увидеть: самый неприятный разбор.
Затем вы возвращаете ссылку на локальную переменную, что плохо. ret
выходит из области видимости, как только функция возвращается.
Фактическая ошибка заключается в том, что вы объявляете функцию внутри вашего оператора, а не объявляете Vec
объект.
Vec ret();
Вы можете исправить это, опустив ()
:
Vec ret;
Кроме того, у вас есть фундаментальная ошибка проектирования, когда вы пытаетесь вернуть ссылку на переменную, которая является локальной для области действия вашего оператора, что приводит к зависанию ссылки. Обычный способ выражения оператора сложения состоит в том, чтобы он возвращал новый объект и обычно реализуется как функция, не являющаяся членом, с такой сигнатурой, как
Vec operator+(const Vec& lhs, const Vec& rhs);
Это может быть реализовано в терминах оператора члена приращения
Vec& operator+=(const Vec& rhs);
Этот может вернуть ссылку на this
следовательно, нет висящей ссылки. Пример реализации od operator+
будет тогда
Vec operator+(Vec lhs, const Vec& rhs)
{
return lhs += rhs;
}
Как и другие заявили ваше первоначальное заявление ret
который вы считаете построением по умолчанию Vec
на самом деле вперед delcaring функция, которая не принимает аргументов и возвращает Vec
, Ака то самый неприятный разбор.
Так же переменное затенение ‘ret’ внутри оператора if означает, что вы не изменяете переменную, которую ожидаете вернуть. Вполне вероятно, что вы хотите что-то более похожее на это:
Vec Vec::operator+(const Vec& v2) const{
Vec ret(mySize);
if(mySize>0){
for(unsigned i = 0;i<mySize;i++){
ret[i]=v2[i]+myArray[i];
}
}
else{
}
return ret;
}