Re: Friend operators don't work where class member operators do.
cesar tejeda wrote:
I have a C++ question. I'm having problems when defining operators as
friends of the class, and those problems get solved when I define the
operators as class members.
The rules concerning the two are subtly different.
The problem I have is that I have the operators defined like this:
template<class real> class vect3d{
.... skipping .....
template<class r> friend vect3d<r>
operator+(const vect3d<r>& vl,const vect3d<r>& vr);
friend real operator*(vect3d& vl,vect3d& vr){
Question: does the operator* really modify it's arguments? If
not, they should probably be declared const.
return (vl[0]*vr[0]+vl[1]*vr[1]+vl[2]*vr[2]);
};
.... skipping .....
}
and when I do like this:
vect3d a(1.,0.,0.),b(0.,1.,0.),c(0.,1.,0.);
cout<<"a*(a+b)="<<a*(a+b)<<endl;
I get the error:
test2.cpp: In function `int main()':
test2.cpp:170: error: no match for 'operator*' in 'a * operator+(const
vect3d<real>&, const vect3d<real>&) [with real = double]((&b))'
test2.cpp:55: error: candidates are: double operator*(vect3d<double>&,
vect3d<double>&)
That's because you didn't declare the parameters to operator*
const, and you cannot bind the temporary resulting from the +
operator to a non-const reference.
But doing like this :
cout<<"a*b="<<(a*b)<<"; a+b="<<(a+b)<<endl;
I get no errors.
That's because you don't try to bind a temporary to the
non-const reference.
Can someone tell me why?
I can not understand why, if I redefine the operators like this (making
them class members):
template<class real> class vect3d{
.... skipping .....
vect3d<real> operator+(vect3d<real> const & vr);
friend real operator*(vect3d& vl,vect3d& vr){
This looks exactly the same as the previous version. Are you
sure you didn't make operator* a member as well (or make its
parameters const)? Or perhaps have operator+ return a
reference?
return (vl[0]*vr[0]+vl[1]*vr[1]+vl[2]*vr[2]);
};
.... skipping .....
};
I get no error this time..., it is suppoused to be the same.
No it's not. One of the differences is that you can call a
non-const member function on a temporary, but you cannot bind a
temporary to a non-const reference. Given a member function:
real operator*( vect3d& rhs ) ;
"a*(b+c)" should be illegal, but "(b+c)*a" no.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]