2010-05-18 17 views
26

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?¿Se pueden especificar explícitamente los parámetros de plantilla de un constructor?

Un ejemplo artificioso:

struct A { 
    template<typename T> 
    A() {} 
}; 

¿Hay una manera de crear una instancia de 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 fuera no parece que el compilador para encontrar el constructor con plantilla correcta. Especificar explícitamente los parámetros de la plantilla probablemente generaría más mensajes de error útiles o incluso resolvería el problema.

+1

explícitamente que especifican argumentos de plantilla para los constructores sólo funciona en especializaciones explícitas, ejemplificaciones, de las definiciones de línea y declaraciones amigo del constructor. –

+0

'template struct A { template A() {} };' funciona bien para mí. Pero, por supuesto, ahora tenemos clase de plantilla. – bruziuz

Respuesta

32

No. El estándar de C++ 03 dice:

[Nota: debido a que la lista de argumentos de plantilla explícita sigue al nombre de plantilla de función, y porque plantillas de función miembro de la conversión y plantillas de función miembro de constructor son llamados sin utilizando un nombre de función, no hay forma de proporcionar una lista de argumentos de plantilla explícita para estas plantillas de función.] (§14.5.2/5)

3

no, no se puede crear una instancia de esa clase usando ese constructor. PERO:



struct A 
{ 
    template < typename T > 
    A(T const&); 
}; 

Ahora usted puede.

+3

No entiendo muy bien la respuesta ... ¿cómo se relaciona con la pregunta? –

+2

Muestra cómo puedes hacerlo. Da la casualidad de que no puedes hacerlo de la forma en que se hizo la pregunta. – MSN

+0

Los comentarios demasiado malos no pueden ser degradados. Ese está lejos de ser "genial". –

8

Hay otra solución para transferir información de tipo a constructores con plantilla que puede ' t tomar un valor de este tipo como un argumento nt:

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 va a funcionar, a causa de análisis sintáctico más irritante. Sería interpretado como una declaración de función. Ver this question para una explicación más detallada.

Cuestiones relacionadas