我有這樣一個遞歸類型:模板遞歸類型
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
這工作正常,但更換std::map
與std::unordered_map
導致編譯錯誤,由於不完全類型。我(或gcc)在某處發生錯誤嗎?或者這只是標準的一部分?
我還想通過模板參數(例如std::stack
和std::queue
)確定內部容器,但是我找不到一種方法來完成它,因爲這需要定義SomeType。
不完整的例子:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
我知道這可以運行間接來完成,但是這不是我要找的。
標準庫容器模板需要實例化他們完整的類型;一切都是未定義的行爲。你必須忍受這一點。不過,您可以使用pimpl解決方案來解決這個問題。 – 2012-03-25 13:45:44
@KerrekSB是這樣嗎?該死,我經常編寫n-ary樹,其節點是用'std :: vector children'來實現的。 –
2012-03-25 13:46:42
@KonradRudolph:好的,你必須確保在實例化時類型已經完成。這可能是一個微妙的問題。 – 2012-03-25 13:57:51