我有一个像这样的递归数据类型:
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;
我知道这可以通过运行时间接操作来完成,但这不是我想要的。
最佳答案
您的类(class)在其定义的最终}
之前的任何地方都不完整。因此,mapping
成员在其类型的模板参数中使用了不完整的SomeType
类型。
The standard does not allow this, and it is pure luck that it works with some STL containers.
您的第二个问题属于相同的答案-首先这样做是违法的。
关于c++ - 模板化递归数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9860503/