C++ vector使用问题:NetBeans 8提示无法解析标识符push_back
解决C++ vector成员变量无法调用push_back的问题
我来帮你排查这个问题,你遇到的Unable to resolve identifier push_back错误主要是由几个语法问题和变量遮蔽问题导致的,一步步来修复:
1. 修复类定义中的语法错误
首先看你的类声明,有两个明显的语法问题:
add函数缺少返回值类型,C++中函数必须指定返回类型(如果没有返回值就要写void)- 类定义的末尾必须加上分号
;,否则编译器会解析失败
修正后的头文件代码:
#include <vector> // 别忘了包含vector的头文件! // 如果myObject是自定义类,需要提前声明或者包含它的头文件 class myObject; class MyClass{ private: std::vector<myObject> test; // 成员变量 public: MyClass(); void add(myObject object); // 补充void返回值 }; // 类结尾加分号
2. 移除构造函数中的局部变量遮蔽
你的构造函数里重新定义了一个局部的test向量:
MyClass::MyClass(){ std::vector<myObject> test; // 这是局部变量,会遮蔽成员变量test }
这个局部变量完全是多余的,它会和类的成员变量重名,而且成员变量test会自动默认初始化,不需要你再重新定义。删掉这行代码,构造函数可以简化为空:
MyClass::MyClass(){ // 空构造函数即可,成员vector会默认初始化 }
3. 确保myObject的定义可见
如果myObject是你自己定义的类,必须在使用它的地方(比如MyClass的头文件)提前声明或者包含它的头文件。如果IDE找不到myObject的定义,也会间接导致无法识别std::vector<myObject>的成员函数push_back。
比如如果myObject在myObject.h里,就需要在MyClass的头文件开头加上:
#include "myObject.h"
或者如果只是声明的话,可以写class myObject;,但如果需要拷贝myObject(比如push_back会调用拷贝构造),就必须包含完整的定义。
4. 修正add函数的实现
现在你的add函数应该可以正常识别成员变量test了,修正后的实现:
void MyClass::add(myObject object){ // 补充返回值类型void test.push_back(object); }
做完这些修改后,NetBeans的代码提示应该会正常工作,编译也不会报错了。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

