Re: operator+() code for objects
silentway wrote:
I am trying to create a simple vector class with overloaded operators
for assignment, +=, -=, +, *, etc
My code for the overloaded operators worked OK, until I tried operator+
()
The problem is that I can not return a local variable.
The problem here is not actually that you cannot return a local variable, but
rather that you do not have a copy constructor that can perform the required
copy initialization of F from the value returned by your overload operator+()
(see below).
This is fair
enough, but I am sure that this used to work ok 10 years ago, when I
was using Zortech compiler. I am back to C++ after an outrageously
long break without doing any codng. I am now using g++ compiler.
I was not seriously coding in C++ 10 years ago and have never used the Zortech
compiler, but as 10 years leaves us still within the time of the C++98 standard,
I very much doubt that any compiler that aimed to be standards-compliant (if
Zortech ever did) would have compiled the code as is.
class vec
{
public:
// <snip>
vec(vec &rv) : mx(rv.mx) { printf("in copy constr\n"); } // ;
// <snip>
const vec operator+(const vec &rv);
// <snip>
};
Here, your copy constructor takes its argument by non-const reference, whereas
the return value from your overloaded op+ is a const rvalue which will fail to
bind on both counts.
<snip>
int main () {
vec A(0.5); A.print("A:");
vec B(0.1); B.print("B:");
// <snip>
// vec F = A + B; // problem!!
//error: no matching function for call to 'vec::vec(vec)'
return 0;
}
(From your code as given, I would have expected the error message to have been
error: no matching function for call to 'vec::vec(const vec)'.
Removing the const from the return value of your op+ would be needed to produce
the error you give here.)
The class and test code works OK except for the line
vec F = A + B;
In this line we have a call to your op+ followed by copy initialization of F.
There must be a valid copy constructor that can handle the result of op+ in
order to perform the initialization (even where the compiler might choose to
elide it). As mentioned, your op+ returns a const rvalue, whereas your copy
constructor as given is looking for a non-const lvalue. Removing the const from
the return value of op+ is not sufficient, as we still have an rvalue which will
not bind to the non-const reference of your copy constructor. What you need is:
vec::vec(const vec& rv);
The error message is
error: no matching function for call to 'vec::vec<const vec>'
I have seen lots of examples that use the above code (or similar), but
they don't seem to work for me
I am starting to suspect that gcc / g++ does not support something
here, but that sounds too crazy
gcc is doing fine! ;-)
Regards
Paul Bibbings
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]