C++源文件使用头文件类内struct报错:BoxPoint未声明的解决
报错原因与解决方法
问题重现
头文件abc.hpp:
#include <iostream> #include <stdio.h> #include <vector> using std::vector; class ABC { public: struct BoxPoint { float x; float y; } ; vector<BoxPoint> getBoxPoint(); }; // 注:原代码缺失类的闭合花括号,此处补充以保证头文件可编译
源文件abc.cpp:
#include "abc.hpp" vector<BoxPoint> ABC::getBoxPoint(){ vector<BoxPoint> boxPointsl; BoxPoint xy = {box.x1, box.y1}; // box变量未定义 boxPointsl.push_back(xy); return boxPointsl; // 原代码缺失分号,此处补充 }
编译错误:
error: ‘BoxPoint’ was not declared in this scope
报错原因
BoxPoint是ABC类的嵌套公共结构体,在类外部定义成员函数时,函数返回值部分的作用域尚未进入ABC的类作用域,直接写BoxPoint编译器无法识别该类型。改成void返回时,函数签名不需要用到该类型,因此不会触发这个错误。
解决方法
在返回值中的BoxPoint前添加ABC::作用域限定符,修正后的函数代码如下:
vector<ABC::BoxPoint> ABC::getBoxPoint(){ vector<ABC::BoxPoint> boxPointsl; ABC::BoxPoint xy = {box.x1, box.y1}; // 此处也可添加作用域,代码更清晰 boxPointsl.push_back(xy); return boxPointsl; }
注:函数体内部的BoxPoint因已处于ABC::作用域中,也可直接使用,但添加作用域限定符能避免歧义,提升代码可读性。
额外需修正的问题
- 头文件中
ABC类定义末尾缺失闭合花括号};,必须补充,否则头文件无法编译。 - 源文件中
box变量未定义,需提前声明或初始化该变量,否则会触发新的编译错误。 return boxPointsl语句末尾缺失分号,必须补充。
内容的提问来源于stack exchange,提问作者Nguyen Tien Su
相关产品推荐
相关产品推荐

