std::vector<结构>:所述结构内部的迭代器导致";错误:无效使用不完整类型"



我有一个C11std::结构向量。该结构包含同一类型的另一个结构的迭代器,用于描述树。

使用正向声明是行不通的,因为向量需要有结构的完整定义,但在定义完成之前,向量不能有结构的完全定义。

#include <vector>
template <class Payload>
class Tree
{
public:
typedef struct _Node Node;
struct _Node
{
Payload t_payload;
//error: invalid use of incomplete type '_Value_type {aka struct _Node}'
std::vector<Node>::iterator pst_father;
};
std::vector<Node> gast_tree;
};
int main()
{
Tree<int> my_tree;
return 0;
}
in instantiation of 'void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = _Node*]':
required from 'void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator<_T2>&) [with _ForwardIterator = _Node*; _Tp = _Node]'
required from 'std::vector<_Tp, _Alloc>::~vector() [with _Tp = _Node; _Alloc = std::allocator<_Node>]'
required from here
error: invalid use of incomplete type '_Value_type {aka struct _Node}'

我希望std::vector作为Node结构的容器,并且我希望Node(s(彼此链接以构建树。使用int索引而不是迭代器并稍后解析引用是很琐碎的,但我正在尝试学习std::vector<gt;:迭代器。这编译得很好:

#include <vector>
template <class Payload>
class Tree
{
public:
typedef struct _Node
{
Payload t_payload;
//use a dumb index
int s32_father_index;
} Node;
std::vector<Node> gast_tree;
};
int main()
{
Tree<int> my_tree;
return 0;
}

我尝试了几种方法,但无法编译迭代器。有可能在对象内部为对象设置迭代器吗?

解决方案

关键字typedef在C++中是多余的。在模板的定义仍然不完整的情况下,可以使用关键字typename。详细信息。

#include <vector>
template <class Payload>
class Tree
{
public:
struct Node
{
Payload t_payload;
typename std::vector<Node>::iterator pst_father;
};
std::vector<Node> gast_tree;
};
int main()
{
Tree<int> my_tree;
return 0;
}

解决方案

关键字typedef在C++中是多余的。在模板的定义仍然不完整的情况下,可以使用关键字typename。

#include <vector>
template <class Payload>
class Tree
{
public:
struct Node
{
Payload t_payload;
typename std::vector<Node>::iterator pst_father;
};
std::vector<Node> gast_tree;
};
int main()
{
Tree<int> my_tree;
return 0;
}

最新更新