¿Por qué no se permite sobrecargar "=" usando la función de amigo? He escrito un programa pequeño pero está dando un error.¿Por qué no podemos sobrecargar "=" usando la función amigo?
class comp
{
int real;
int imaginary;
public:
comp(){real=0; imaginary=0;}
void show(){cout << "Real="<<real<<" Imaginary="<<imaginary<<endl;}
void set(int i,int j){real=i;imaginary=j;}
friend comp operator=(comp &op1,const comp &op2);
};
comp operator=(comp &op1,const comp &op2)
{
op1.imaginary=op2.imaginary;
op1.real=op2.real;
return op1;
}
int main()
{
comp a,b;
a.set(10,20);
b=a;
b.show();
return 0;
}
La compilación da el siguiente error: -
[[email protected] stackoverflow]# g++ prog4.cpp
prog4.cpp:11: error: ‘comp operator=(comp&, const comp&)’ must be a nonstatic member function
prog4.cpp:14: error: ‘comp operator=(comp&, const comp&)’ must be a nonstatic member function
prog4.cpp: In function ‘int main()’:
prog4.cpp:25: error: ambiguous overload for ‘operator=’ in ‘b = a’
prog4.cpp:4: note: candidates are: comp& comp::operator=(const comp&)
prog4.cpp:14: note: comp operator=(comp&, const comp&)
Sus razones no son válidas, porque 'operator =()' no está más vinculado a la instancia de destino que 'operator + =()', que * puede * definirse fuera de la clase, porque el compilador no interferirá e introducirá ambigüedad. –
No dije que la semántica es lo que hace la distinción, o bien, como usted dice, todo 'operatorX =' tendría que ser funciones miembro. La razón por la cual no puede ser una función libre está en el primer párrafo: porque el estándar así lo dice. Supongo que no estaba claro, el inglés no es mi lengua materna. Solo quise decir que desde el punto de vista semántico tiene más sentido tener 'operatorX =' (incluyendo 'operator =') como funciones miembro, incluso si 'operatorX' generalmente se implementa mejor como una función gratuita. –
Supongo que la pregunta es por qué el estándar dice que sí ;-) –