Ten en cuenta que en las ciencias un error casi siempre tiene más de una soluciones, así que aquí enseñamos lo más óptimo y mejor.
Solución:
Por lo que entiendo, el compilador intenta varios caminos para interpretar a = (A)b
.
- encuentra el
operator A
- pero también encuentra la
operator int
en B, y elA(int)
constructor que le da una segunda rutaB => int => A
…
Y no sabe cuál elegir.
Para arreglar la compilación, puedo:
- quitar el
operator int
desde B - reescribe la línea de error como
A a = b.operator A();
…
El mensaje de error significa que estos dos operadores
operator A(void) const return A(_m);
operator int(void) const return _m;
se puede usar en la expresión
(A)b;
Como resultado, al usar estos operadores de conversión, se puede usar el constructor A( int )
o el constructor de copia por defecto A( const A & )
.
Para hacerlo más claro, reescriba la declaración correspondiente como
A a = A( b );
Entonces, si el objeto b se convierte en un objeto del tipo A usando el primer operador de conversión o en un objeto del tipo int usando el segundo operador de conversión.
Podría evitar la ambigüedad declarando los operadores, por ejemplo, como
operator A(void) const & return A(_m);
operator int(void) const && return _m;
es decir, para lvalues se usará el primer operador y para rvalues se usará el segundo operador.
Aquí está su programa con los operadores modificados.
#include
class A
public:
A(void) :_m(0)
A(int val) : _m(val)
private:
int _m;
;
class B
public:
B(void) : _m(0)
B(int val) : _m(val)
B(const A&);
// there is a direct conversion operator here
operator A(void) const & return A(_m);
operator int(void) const && return _m;
private:
int _m;
;
int main()
B b;
A a = b;
A a1 = B();
Aquí puedes ver las reseñas y valoraciones de los usuarios
Si te gustó nuestro trabajo, tienes la libertad de dejar un enunciado acerca de qué te ha gustado de esta reseña.