Saltar al contenido

Error de compilación de C++: no se puede convertir de B a A, no hay constructor o ambigüedad de sobrecarga del constructor

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 el A(int) constructor que le da una segunda ruta B => 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *