ho un tipo di dati ricorsiva simili:tipi di dati ricorsivi templated
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
Questo funziona bene, ma sostituendo std::map
con std::unordered_map
risultati in un errore di compilazione a causa di un tipo incompleto. Sono (o gcc) facendo un errore da qualche parte? o è solo una parte dello standard?
Vorrei anche avere il contenitore interno determinato da un parametro di template (come std::stack
e std::queue
), ma non riesco a trovare un modo per farlo perché ciò richiederebbe SomeType essere già definito.
esempio incompleto:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
so che questo può essere fatto con riferimento indiretto fase di esecuzione, ma non è quello che sto cercando.
Il contenitore libreria standard modelli richiedono che li un'istanza con i tipi completi; tutto il resto è un comportamento indefinito. Devi vivere con quello. Tuttavia, puoi utilizzare una soluzione Pimpl per ovviare a questo problema. –
@KerrekSB È così? Dannazione, ho scritto regolarmente alberi n-ari i cui nodi sono stati implementati in termini di 'std :: vector children'. –
@KonradRudolph: beh, devi assicurarti che al momento dell'istanziazione il tipo sia completo. Potrebbe essere un problema sottile. –