es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Inicialización de la clase de plantilla en el programa principal.

“`
clase Q
{
Q(const Q &obj) {} // constructor de copia
Q& operator= (const Q& a){} // sobrecarga operador igual
}

template <class t="">
class B{
public:
T x;
B<t>(T t){
// x = t;
}
}

int main(){
Q a(2);
a.init(1,0);
a.init(2,1);
B<q> aa(a); // esta línea da error
}

¿Cómo inicializar una clase de plantilla con un constructor de copia? B<q> aa(a); // esta línea da error
Quiero resolverlo pero no pude.
Error:
no hay función coincidente para llamar a 'Q::Q()'|
candidato: Q::Q(const Q&)|
candidato espera 1 argumento, 0 proporcionados|
candidato: Q::Q(int)|
candidato espera 1 argumento, 0 proporcionados|
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no hay un constructor coincidente para la clase Q. Esto se debe a que el constructor de copia Q(const Q& obj) requiere que se pase un objeto de la clase Q como argumento, pero la clase B está intentando instanciar un objeto de tipo Q sin proporcionar ningún argumento al constructor.

    Para solucionar este error, debemos modificar el constructor de la clase B para que pueda aceptar un objeto de tipo Q como argumento y pasarlo a la variable miembro x.

    Una forma de hacer esto es agregar un nuevo constructor a la clase B que tome un objeto de tipo Q como argumento e inicialice la variable miembro x con él:

    template <class t="">
    class B {
       public:
       T x;
       B<t>() {}
       B<t>(T t) {
            x = t;
       }
       B<t>(const Q& q) {
            x = q;
       }
    };
    
    int main()
    {
        Q a(2);
        a.init(1,0);
        a.init(2,1);
        B <q> aa(a);
    }
    

    Ahora podemos crear un objeto de tipo B pasando un objeto de tipo Q a su constructor:

    B <q> aa(a); // sin error
    

    Note que también agregamos un constructor predeterminado B() {} a la clase B para evitar otro error relacionado con el constructor predeterminado que no está definido.

Comments are closed.