相关疑难解决方法(0)

如何在Visual Studio 2010中使用Boost

有关如何在Visual Studio中的空项目中使用Boost库的一步一步解释是什么?

c++ boost visual-studio-2010

361
推荐指数
9
解决办法
26万
查看次数

标准容器模板可以用不完整的类型实例化吗?

有时,实例化具有不完整类型的标准容器以获取递归结构是有用的:

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;
};
Run Code Online (Sandbox Code Playgroud)

这往往起作用,因为容器没有按值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链接的文章中的破损示例相同.然而,虽然这篇文章似乎理所当然地认为"没有什么可以起作用",但解决方案对我来说似乎很简单 - std::map内部tree_node类应该是非成员模板,而不是成员非模板类.

无论如何,那篇文章很好地建立了设计意图,所以我想我的挑剔是关于"功能要求"的副标题只是那样.

c++ templates stl incomplete-type

16
推荐指数
2
解决办法
1583
查看次数