2009-01-14 22 views
11

C++ no puede convertir una plantilla en un typedef o typedef en una clase de plantilla. Sé que si heredo y hago de mi clase una plantilla, funcionará.Herencia en lugar de typedef

Ejemplos:

// Illegal 
template <class T> 
typedef MyVectorType vector<T>; 

//Valid, but advantageous? 
template <class T> 
class MyVectorType : public vector<T> { }; 

está haciendo esto ventajosa de manera que pueda "falso" un typedef o hay mejores maneras de hacer esto?

+0

pregunta similar, mismas respuestas: http://stackoverflow.com/questions/293988/generic-vector-of-vectors-in-c –

+0

Su segundo ejemplo tampoco es válido. Deberá escribir sus propios constructores para MyVectorType ya que no puede heredarlos. – Sebastian

Respuesta

13

C++ 0x añadirá typedefs plantilla usando la palabra clave using.

Su solución declara un nuevo tipo, no un tipo "alias", p. no puede inicializar un MyVectorType & (referencia) con un vector<T>. Esto podría no ser un problema para ti, pero si lo es, pero no quiero hacer referencia a vector en el código, que puede hacer:

template <typename T> 
class MyVectorType { 
public: 
    typedef std::vector<T> type; 
}; 
+0

std :: vector tiene un destructor no virtual, por lo que debe tener cuidado de no eliminar un MyVectorType a través de std :: vector * –

+0

No estaba proponiendo usar MyVectorType como el tipo de datos real, sino más bien MyVectorType :: type, que es un typedef para std :: vector , por lo que no hay peligro aquí. –

10

La herencia no es lo que desea. Un enfoque más idiomática a la emulación de un typedef plantilla es la siguiente:

template <typename T> struct MyVectorType { 
    typedef std::vector<T> t; 
}; 

Consulte la typedef como esto:

MyVectorType<T>::t; 
1

C++ es incapaz de hacer una plantilla de una typedef o typedef una clase con plantilla.

Eso depende de lo que entendemos por typedef: std::vector<size_t> es legal - a pesar de que size_t es un typedef - y std::string es una typedef para std::basic_string<char>.