2010-01-26 24 views
16

sugerir que tengo una función de plantilla como la siguiente:¿Cómo inicializar correctamente la variable miembro del tipo de plantilla?

template<class T> 
void doSomething() 
{ 
    T a; // a is correctly initialized if T is a class with a default constructor 
    ... 
}; 

Pero variable a deja sin inicializar, si T es un tipo primitivo. Puedo escribir T a (0), pero esto no funciona si T es una clase. ¿Hay alguna manera de inicializar la variable en ambos casos (T == clase, T == int, char, bool, ...)?

+0

editado pregunta tilde para evitar ambigüedad si una variable de plantilla o miembro de la plantilla se entiende. Hay algo de magia de plantilla relacionado con el anterior. – Swift

Respuesta

28

así:

T a{}; 

Pre-C++ 11, esto era la aproximación más simple:

T a = T(); 

Pero requiere T ser copiables (aunque la copia es seguro que va ser eliminado).

+2

acaba de notar que algo así como 'int i = bool()' también funciona ... ¿por qué es esto legal?! ... ¿'bool()' tiene algún tipo de función en este caso? – smerlin

+0

btw, 'unsigned int i = unsigned int();' no se compila con GCC, pero ¿es legal? – smerlin

+0

@smerlin: Respondí tu primera pregunta y formulé formalmente tu segunda pregunta: http://stackoverflow.com/questions/2144012/exposed-type-conversion-and-multiple-simple-type-specifiers; Creo que la respuesta es que esto no es válido para los tipos especificados por una combinación de especificadores de tipo simples, p. 'unsigned int'. –

0

campo de la plantilla de clase en C++ 11 tiene la misma sintaxis:

template <class T> 
class A { 
    public: 
    A() {} 
    A(T v) : val(v) {} 
    private: 
    T val{}; 
}; 
Cuestiones relacionadas