有时它来实例化一个标准集装箱用一个不完整的类型得到递归结构是有益的:标准容器模板可以使用不完整类型实例化吗?
struct multi_tree_node { // Does work in most implementations
std::vector<multi_tree_node> child;
};
struct trie_node { // Does not work in most implementations
std::map< char, trie_node > next;
};
这往往会工作,因为容器没有那通型value_type
或成员函数成员或返回任何value_type
对象的价值。该标准似乎没有太多关于不完整的模板参数,但在C++ 11§17.6.4.8[lib.res.on.functions],“对其他函数的要求”中有一点:
特别是,在以下情况下效果未定义:...如果在实例化模板组件时使用了不完整类型(3.9)作为模板参数,除非该组件特别允许。
这是否使上述构造非法,即使实例不在块范围内?这是否属于“用于实例化标准库模板组件的类型的操作”(也是17.6.4.8)?或者是一个库实现被禁止引发模板实例化,当所有特别需要的实例化成功时,这些模板实例化可能会因为不完整类型而失败?由于只有函数可以调用和实例化其他函数,因此将“类型...上的操作”限制为块范围中的那些函数似乎将成员函数的内容保留为比签名和成员的内容更严格的要求类定义。毕竟,在之前,与multi_tree_node
之间没有任何意义,直到类型完成为止。这扩展到std::unique_ptr
,即使在块范围中使用时,它也明确支持不完整类型参数。
编辑2:服务我没有困扰测试trie_node
的例子 - 我甚至尝试过。这与@Ise链接的the article中的破坏示例相同。然而,虽然这篇文章似乎理所当然地认为“没有那样的东西可行”,但解决方案对我来说似乎很简单 - 的内部tree_node
类应该是非成员模板,而不是成员非模板类。
无论如何,那篇文章确定了很好的设计意图,所以我猜想我在“功能需求”子标题下的挑剔只是这一点罢了。
我没有在您发布的代码中看到任何不完整的类型? –
@JohnDibling:'trie_node'在定义'next'时是不完整的。 –
@JohnDibling在一个类的范围内,它是不完整的。 – Potatoswatter