que tienen un tipo de datos recursiva como esto:con plantilla tipos de datos recursivas
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
Esto funciona bien, pero sustituyendo std::map
con std::unordered_map
da como resultado un error de compilación debido a un tipo incompleto. ¿Estoy (o gcc) cometiendo un error en alguna parte? o es esto solo parte del estándar?
También me gustaría tener el contenedor interno determinado por un parámetro de plantilla (como std::stack
y std::queue
), pero no puedo encontrar una manera de hacerlo ya que eso requeriría que SomeType ya estuviera definido.
ejemplo incompleto:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
sé que esto se puede hacer con el tiempo de ejecución indirecta, pero eso no es lo que estoy buscando.
El contenedor de la biblioteca estándar de plantillas exigen que se ejemplariza con tipos completos; todo lo demás es un comportamiento indefinido. Tienes que vivir con eso. Sin embargo, puedes usar una solución de pimpl para evitarlo. –
@KerrekSB ¿Es así? Maldición, regularmente he escrito arboles n-arios cuyos nodos fueron implementados en términos de 'std :: vector children'. –
@KonradRudolph: Bueno, debe asegurarse de que en el momento de la instanciación el tipo esté completo. Eso puede ser un problema sutil. –