Ich habe einen rekursiven Datentyp wie folgt aus:Templat rekursiven Datentypen
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
Dies funktioniert gut, aber wegen eines unvollständigen Typ in einem Compiler-Fehler std::map
mit std::unordered_map
Ergebnisse zu ersetzen. Bin ich (oder gcc) irgendwo einen Fehler gemacht? oder ist das nur ein Teil des Standards?
Ich würde auch von einem Template-Parametern (wie std::stack
und std::queue
) bestimmt wie den inneren Behälter haben, aber ich kann nicht einen Weg finden, um es zu tun, da die Sometype erfordern würde bereits definiert werden.
Unvollständige Beispiel:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
Ich weiß, das mit Laufzeit indirection getan werden kann, aber das ist nicht das, was ich suche.
Die Standardbibliothek Container-Vorlagen erfordern, dass Sie sie mit kompletten Typen instanziiert; alles andere ist undefiniertes Verhalten. Du musst damit leben. Sie können jedoch eine pimpl-Lösung verwenden, um das zu umgehen. –
@KerrekSB Ist das so? Verdammt, ich habe regelmäßig N-Bäume geschrieben, deren Knoten im Sinne von 'std :: vector children' implementiert wurden. –
@KonradRudolph: Nun, Sie müssen sicherstellen, dass bei der Instanziierungszeit der Typ abgeschlossen ist. Das könnte ein subtiles Problem sein. –