我有这样一个递归类型:模板递归类型
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