c++ - ¿Se pueden especificar explícitamente los parámetros de plantilla de un constructor?
templates syntax (3)
Un constructor de una clase puede ser una función de plantilla. En el punto en el que se llama a un constructor de este tipo, el compilador normalmente examina los argumentos dados al constructor y determina los parámetros de plantilla usados a partir de ellos. ¿También hay alguna sintaxis para especificar los parámetros de la plantilla explícitamente?
Un ejemplo artificial:
struct A {
template<typename T>
A() {}
};
¿Hay alguna manera de instanciar esta clase? ¿Cuál es la sintaxis para especificar explícitamente los parámetros de la plantilla del constructor?
Mi caso de uso sería un problema si el compilador no parece encontrar el constructor con plantilla correcto. Especificar explícitamente los parámetros de la plantilla probablemente generaría más mensajes de error útiles o incluso resolvería el problema.
Hay otra solución para transferir información de tipo a constructores con plantilla que no puede tomar un valor de este tipo como argumento:
template<class T>
struct id
{};
struct A {
template<class T>
A(id<T>);
};
A a=id<int>();
Editar:
Tenga en cuenta: A a(id<int>());
no funcionará, debido al análisis más molesto. Sería interpretado como una declaración de función. Vea esta pregunta para una explicación más detallada.
No. El estándar C ++ 03 dice:
[Nota: debido a que la lista explícita de argumentos de la plantilla sigue el nombre de la plantilla de función, y debido a que las plantillas de funciones miembro de conversión y las plantillas de funciones miembro constructor se llaman sin utilizar un nombre de función, no hay forma de proporcionar una lista explícita de argumentos de plantilla para estas plantillas de función. ] (§14.5.2 / 5)
no, no puedes instanciar esa clase usando ese constructor. PERO:
struct A
{
template < typename T >
A(T const&);
};
Ahora usted puede.