Constructor de copia de plantilla de C++ en la clase de plantilla

Constructor de copia de plantilla de C++ en la clase de plantilla

Un constructor de copias tiene la forma X(X& ) o (X const&) y el compilador le proporcionará si no declaró uno usted mismo (o algunas otras condiciones que no son relevantes aquí). No lo hiciste, así que implícitamente tenemos el siguiente conjunto de candidatos:

MyTemplateClass(const MyTemplateClass&);
template <typename U> MyTemplateClass(const MyTemplateClass<U>&);

Ambos son viables para

MyTemplateClass<int> instance2(instance);

Ambos toman exactamente los mismos argumentos. El problema no es que su plantilla de constructor de copia no coincide . El problema es que el constructor de copia implícito no es una plantilla de función, y se prefieren las no plantillas a las especializaciones de plantilla cuando se trata de la resolución de sobrecarga. De [over.match.best], omitiendo las viñetas no relacionadas:

Es por eso que llama a su constructor de copia implícito (y luego explícito) sobre su plantilla de constructor.


Cuando no tiene un constructor de copia en su código, el compilador lo generará implícitamente. Por lo tanto, cuando se ejecuta esta línea:

MyTemplateClass<int> instance2(instance);

Un constructor de copias es siendo ejecutado, aunque obviamente no es tuyo. Creo que las plantillas no tienen nada que ver con eso.

Lea más sobre esto aquí:Constructor de copia definido implícitamente