我有一个像这样的递归数据类型:

template<typename T>
struct SomeType {
    std::map<T, SomeType<T>> mapping;
};

SomeType<int> foo;

这可以正常工作,但是由于类型不完整,用std::map替换std::unordered_map会导致编译错误。我(或gcc)在某处出错吗?还是这只是标准的一部分?

我也想让内部容器由模板参数(例如std::stackstd::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/

10-11 18:55