如何正确声明vector类型?头文件'MyTreeModelNodePtrArray'类型错误排查
问题1:正确声明vector类型的方式
vector是C++标准库的容器,常见的声明方式有以下几种:
- 基础声明:指定元素类型,声明一个空vector
std::vector<int> int_list; std::vector<std::string> str_list; - 带初始值或大小的声明:
// 初始化包含5个值为0的int元素 std::vector<int> int_list(5, 0); // 用初始化列表直接赋值 std::vector<std::string> str_list{"apple", "banana", "cherry"}; - 类型别名声明(复用复杂vector类型):如果需要多次使用某类复杂的vector类型,可通过
using或typedef定义别名,简化代码// 使用using定义别名(C++11及以上推荐) using IntVector = std::vector<int>; IntVector int_list; // 使用typedef定义别名(兼容C++98) typedef std::vector<std::string> StringVector; StringVector str_list;
问题2:解决头文件的编译错误
错误原因
你写的std::vector<std::unique_ptr<MyTreeModelNode>> MyTreeModelNodePtrArray;是声明了一个对象,而非类型别名。但在类的成员函数GetChildren()和成员变量mChildren中,你把MyTreeModelNodePtrArray当成类型来使用,编译器自然找不到对应的类型,因此报错。
修正方案
将对象声明改为类型别名声明,使用using或typedef即可解决问题。修正后的完整代码如下:
#ifndef MYTREEMODELNODE_H #define MYTREEMODELNODE_H #include <wx/wx.h> #include <memory> #include <vector> class MyTreeModelNode; // 用using定义类型别名(C++11及以上推荐) using MyTreeModelNodePtrArray = std::vector<std::unique_ptr<MyTreeModelNode>>; // 或者用typedef定义(兼容C++98) // typedef std::vector<std::unique_ptr<MyTreeModelNode>> MyTreeModelNodePtrArray; class MyTreeModelNode final { public: MyTreeModelNode(MyTreeModelNode* parent, int id, const wxString& column1, const wxString& column2, const wxString& column3, const wxString& column4); MyTreeModelNode(MyTreeModelNode* parent, const wxString& branch); ~MyTreeModelNode(); MyTreeModelNode* GetParent(); MyTreeModelNodePtrArray& GetChildren(); // 现在可以正确识别类型 private: MyTreeModelNode* pParent; MyTreeModelNodePtrArray mChildren; }; #endif // MYTREEMODELNODE_H
补充说明
MyTreeModelNode的前向声明是有效的,因为std::unique_ptr支持前向声明的类型(仅当不需要调用对象的析构、成员函数等操作时,前向声明足够),而类内部的成员变量mChildren会在类定义完成后才被实例化,此时编译器已经获取了MyTreeModelNode的完整定义,不会出现问题。
内容的提问来源于stack exchange,提问作者Federico Bianchi
相关产品推荐
相关产品推荐

