结构体含std::vector<结构体>::iterator引发“不完全类型非法使用”错误
在结构体中包含自身类型的std::vector迭代器的问题与解决
问题场景与报错
我在C++11中尝试定义一个存储结构体的std::vector,该结构体需要包含指向同类型结构体的迭代器以构建树形结构。尝试用前向声明无法解决问题,因为std::vector需要结构体的完整定义,但结构体定义完成前,vector无法获取该定义。
报错代码
#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间通过迭代器关联构建树。使用整数索引可正常编译,但我想学习std::vector迭代器的用法,请问能否在结构体内部包含指向自身类型的vector迭代器?
解决方案
可以实现,问题的核心在于模板上下文的类型依赖处理,以及冗余语法的问题:
- 原代码中
typedef struct _Node Node;是C风格的冗余写法,C++中直接定义struct Node即可。 - 在模板定义的上下文中,
std::vector<Node>::iterator属于依赖于模板参数的类型,编译器无法自动推断它是一个类型,必须使用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; }
内容的提问来源于stack exchange,提问作者05032 Mendicant Bias
相关产品推荐
相关产品推荐

