C++ C++;使用std::pair模板专门化定义树节点数据结构

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容器库明确支持这一点

考虑以下(C++)代码

A类{…};
名称空间标准
{
模板
结构散列
{
大小\u t运算符()(常数A和A)常数
{
//返回基于组件的唯一哈希
};
};
}
B类
{
std::unordered_map*children;//暂时忽略它是指针这一事实
};

当我编译时,编译器告诉我std::pair::second有不完整的类型(除其他错误外),我认为这是我在B中声明它的错误,但是我不知道如何正确执行。

我认为标准库通常不(必须)支持不完整的类型

我记得,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操作符我认为标准库一般不(必须)支持不完整类型

我记得,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.奥斯特的同一篇开创性文章:/