5

¿Es posible usar typedef en un contenedor estándar sin especializarlo?Tipo de plantilladef para contenedor estándar (sin especialización)?

código como este funciona:

typedef std::vector<int> intVector; 

Pero para que este código:

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Me aparece un error:

template declaration of 'typedef'

Es posible hacer esto en C++ ??

+0

Considerando que todo lo que básicamente está haciendo es cambiar el nombre de 'std :: vector', ¿qué tan desagradable sería usar' #define DynamicArray std :: vector'? – suszterpatt

+0

@suszterpatt - cierto, pero trato de mantenerlo moderno y evitar el uso de las macros inseguras :) – dtech

Respuesta

9

Sí, en C++ 11.

template <typename T> 
using DynamicArray = std::vector<T>; 

(No es que usted debe utilizar este alias exacta.)

+0

Parece que no funciona en Visual Studio 2010 SP1. Obtengo "declaración/definición de plantilla irreconocible" Supongo que aún no es compatible con MS. – dtech

+1

@ddriver: No, no lo es. Y no por VC11, tampoco, AFAIR. Si quieres C++ 11, usa GCC o Clang. –

+0

Encontré una solución para VS simplemente heredando vector. Por favor, vea la respuesta que agregué y arroje algo de luz si esta no es una buena idea. ¡Gracias! – dtech

2

La solución común (si no se está usando C++ 11) es para hacer esto:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> Type; 
}; 

y utilizarlo como DynamicArray<Something>::Type.

6

Si su apoyo compilador de C++ 11:

template <typename T> 
using DynamicArray = std::vector<T>; 

de otro modo (C++ 98 años o más), puede utilizar una estructura como la siguiente ayuda

template<typename T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 

y luego usarlo como

DynamicArray<int>::type my_array; 

La herencia de std :: vector es una solución posible, pero tenga en cuenta que los contenedores STL no tienen destructor virtual. es decir:

template <typename T> 
struct DynamicArray: vector<T> { ... }; 

int main() { 
    vector<int>* p = new DynamicArray<int>(); 
    delete p; // this is Undefined Behavior 
    return 0; 
} 
+0

Sí, pero ¿por qué debería asignar dinámicamente un vector cuando utiliza la asignación de memoria dinámica para sus datos internamente? – dtech

+0

Además, no puedo simplemente escribir un destructor, creo que el destructor del vector debe ser responsable de sus datos, solo tengo que ocuparme de las cosas adicionales que agregué. Podría estar equivocado, no soy muy bueno con C++. – dtech

+0

Quiero decir, seguro, puede haber problemas con el uso de polimorfos, pero como la intención es usar simplemente la clase derivada, no creo que haya ningún problema debido a la falta de destructor virtual. Quiero decir que no es como si fuera a llamar a eliminar en un puntero a vector que realmente apunte a un DynamicArray, que tampoco tiene miembros adicionales dinámicamente asignados para requerir un cuidado extra. Por favor, corríjame si estoy equivocado. ¡Gracias! – dtech

3

Esta sintaxis no es válida en C++, no hay ninguna función como "template typedef".

template <typename T> 
typedef std::vector<T> DynamicArray<T>; 

Sin embargo, C++ 11 introduce una sintaxis de la plantilla alias que es casi como esto:

template <typename T> 
using DynamicArray = std::vector<T>; 

En C++ 03 se puede utilizar una plantilla de metafunción como:

template<class T> 
struct DynamicArray 
{ 
    typedef std::vector<T> type; 
}; 
0

Para agregar mi propia solución a la mezcla

Dado que la característica C++ 11 no es compatible con Visual Studio, decidí simplemente heredar std :: vector, usando esto para añadir algunas funciones:

template <typename T> 
class DynamicArray : public std::vector<T> { 
public: 
    DynamicArray& operator<<(const T& value) 
    { 
     push_back(value); 
     return *this; 
    } 
}; 

Ahora además push_back, encadenamiento también es compatible:

DynamicArray<int> array; 
array << 1 << 2 << 3 << 4 << 5 << 6; 

No sé si este enfoque puede tener algunos inconvenientes no deseados , así que si conoce algunos, ¡por favor compártalos!

+1

La herencia de contenedores estándar tiene algunos inconvenientes ... (confíe en mi respuesta) ¿Consideró implementar funciones gratuitas en su lugar? 'DynamicArray & operator << (const DynamicArray & arr, const T & value)' – log0

Cuestiones relacionadas