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.

¿Cómo pasar una instancia de plantilla de C++ a una función?

¿Cómo puedo pasar cualquier objeto de una clase con plantillas a otra función en C++11?

En el fragmento de código a continuación, passInObj no se compila porque se queja de Printer&. Quiero pasar cualquier Printer, no importa qué plantilla T haya usado.

¿Cómo puedo hacer esto y por qué no funciona la solución a continuación?

“`
#include <iostream>
#include <vector>
template <typename t="">
class Printer {
public:
Printer(const T& tl) : t(tl) {}
void print() const {
for (auto x : t) {
std::cout << x << std::endl;
}
}
const T&t;
};

// ESTA LÍNEA NO SE COMPILA
void passInObj(const Printer& p) {
p.print();
}

int main() {
std::vector<std::string> vec;
vec.push_back("ABC");
Printer<><std::string>> printer(vec);
printer.print();
passInObj(p);
return 0;
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En C++11, puedes pasar cualquier objeto de una clase templada a otra función utilizando plantillas. Necesitas usar un parámetro de plantilla en la firma de la función para aceptar cualquier tipo de Printer.

    Para solucionar el error de compilación en el fragmento de código, cambia la firma de passInObj para aceptar cualquier tipo de Printer como un parámetro de plantilla:

    template <typename t="">
    void passInObj(const Printer<t>& p) {
       p.print();
    }
    

    Esto permite pasar cualquier objeto Printer de cualquier tipo T a la función, siempre y cuando el objeto se pase como referencia (&) para evitar el corte de objetos.

    La solución a continuación no funciona porque la firma de la función utiliza una referencia no plantillada a Printer, lo que significa que la función solo puede aceptar objetos de tipo Printer que tienen un argumento de plantilla específico, no cualquier objeto Printer.

Comments are closed.