C++ C++;使用std::pair模板专门化定义树节点数据结构
考虑以下(C++)代码C++ C++;使用std::pair模板专门化定义树节点数据结构,c++,c++11,stl,C++,C++11,Stl,考虑以下(C++)代码 A类{…}; 名称空间标准 { 模板 结构散列 { 大小\u t运算符()(常数A和A)常数 { //返回基于组件的唯一哈希 }; }; } B类 { std::unordered_map*children;//暂时忽略它是指针这一事实 }; 当我编译时,编译器告诉我std::pair::second有不完整的类型(除其他错误外),我认为这是我在B中声明它的错误,但是我不知道如何正确执行。我认为标准库通常不(必须)支持不完整的类型 我记得,Boost容器库明确支持这一点
A类{…};
名称空间标准
{
模板
结构散列
{
大小\u t运算符()(常数A和A)常数
{
//返回基于组件的唯一哈希
};
};
}
B类
{
std::unordered_map*children;//暂时忽略它是指针这一事实
};
当我编译时,编译器告诉我std::pair::second有不完整的类型(除其他错误外),我认为这是我在B中声明它的错误,但是我不知道如何正确执行。我认为标准库通常不(必须)支持不完整的类型 我记得,Boost容器库明确支持这一点,尽管:
#include <boost/container/vector.hpp>
#include <boost/container/list.hpp>
#include <boost/container/map.hpp>
#include <boost/container/stable_vector.hpp>
#include <boost/container/string.hpp>
using namespace boost::container;
struct data
{
int i_;
vector<data> v_; //A vector holding still undefined class 'data'
list<data> l_; //A list holding still undefined 'data'
map<data, data> m_; //A map holding still undefined 'data'
friend bool operator <(const data &l, const data &r)
{ return l.i_ < r.i_; }
};
struct tree_node
{
string name;
string value;
//children nodes of this node
list<tree_node> children_;
};
int main()
{
//a container holding a recursive data type
stable_vector<data> sv;
sv.resize(100);
//Let's build a tree based in
//a recursive data type
tree_node root;
root.name = "root";
root.value = "root_value";
root.children_.resize(7);
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间boost::container;
结构数据
{
国际组织;
vector v_;//一个仍然包含未定义类“data”的向量
list l;//一个仍然包含未定义的“data”的列表
map m_;//一个仍包含未定义的“数据”的映射
friend bool操作符我认为标准库一般不(必须)支持不完整类型
我记得,Boost容器库明确支持这一点,尽管:
那么标准容器呢?不完整类型的容器已经讨论了很长一段时间,正如马特·奥斯特恩(Matt Ostern)的伟大文章()所解释的:
与我的大多数专栏不同,这一条是C++语言标准库不能做的事情>强>:把不完整的类型放在标准容器中。这一列解释了为什么你可能想这么做,为什么标准化委员会禁止它,即使他们知道它是有用的,你可能能做得到。绕过限制。”
Boost.Container提供的所有容器都可以用来定义递归容器
查看它
#include <boost/container/vector.hpp>
#include <boost/container/list.hpp>
#include <boost/container/map.hpp>
#include <boost/container/stable_vector.hpp>
#include <boost/container/string.hpp>
using namespace boost::container;
struct data
{
int i_;
vector<data> v_; //A vector holding still undefined class 'data'
list<data> l_; //A list holding still undefined 'data'
map<data, data> m_; //A map holding still undefined 'data'
friend bool operator <(const data &l, const data &r)
{ return l.i_ < r.i_; }
};
struct tree_node
{
string name;
string value;
//children nodes of this node
list<tree_node> children_;
};
int main()
{
//a container holding a recursive data type
stable_vector<data> sv;
sv.resize(100);
//Let's build a tree based in
//a recursive data type
tree_node root;
root.name = "root";
root.value = "root_value";
root.children_.resize(7);
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间boost::container;
结构数据
{
国际组织;
vector v_;//一个仍然包含未定义类“data”的向量
list l;//一个仍然包含未定义的“data”的列表
map m_;//一个仍包含未定义的“数据”的映射
friend bool operator你能提供你试图编译的代码吗?包括B的定义吗?请提供可执行示例。@sehe实际上我意识到我的示例太泛化了。如果我用它创建一个可执行示例,它会编译,所以我需要更具体地指出。我会尽力缩小范围。你能提供您试图编译的代码?包括B的定义?请提供可执行示例。@sehe实际上我意识到我的示例太泛化了。如果我用它创建一个可执行示例,它会编译,所以我需要更具体地指出。我会尽我最大的努力缩小它的范围。它今天也出现了有趣的现象。它甚至激起了一场争论对支持一般不完整类型(oh和+1)这一概念的变通有趣的是,我给出的示例将编译,但可能不是发生错误的实际代码,因为您显示的代码对无序映射进行了浅层实例化,而不是成员:一旦开始使用成员,它们将被实例化,然后您将看到出现错误。这是已知的作为POI(实例化点)例如,看看ADL的一个令人心碎的例子:@WhozCraig哦嘿,我错过了你的评论。这确实很有趣。我很高兴我引用了m.奥斯特的同一篇开创性文章:/有趣的是今天也浮出水面。它甚至激起了关于支持一般不完整类型(哦,和+1)这一概念的讨论有趣的是,我给出的示例将编译,但可能不是发生错误的实际代码,因为您显示的代码对无序映射进行了浅层实例化,而不是成员:一旦开始使用成员,它们将被实例化,然后您将看到出现错误。这是已知的正如POI(实例化点)所见,例如,ADL中有一个很好的扭曲思维的例子:@WhozCraig哦嘿,我错过了你的评论。这确实很有趣。我很高兴我引用了m.奥斯特的同一篇开创性文章:/