C++头文件定义带构造函数的结构体并创建其队列报错求助
问题排查与修复方案
嘿,我来帮你理清楚这段C++代码里的问题,主要有几个关键错误需要修正:
1. 标准库容器未加std::命名空间限定
queue是C++标准库的容器,属于std命名空间,你直接写queue<r> ROB;编译器根本找不到这个类型,必须加上std::前缀才行:
std::queue<r> ROB;
2. 头文件结构体定义末尾漏写分号
你的my_header.h里的结构体r定义结束后没有加分号,这是C/C++里很容易犯的语法错误,会直接导致编译器解析失败。修正后的头文件代码应该是这样:
#include <cstdlib> // 建议用C++版本的头文件代替C的stdlib.h #include <iostream> struct r { bool b; int i; int j; r(int num1, int num2) { // 这里可以补充你的初始化逻辑,比如给成员变量赋值 i = num1; j = num2; b = false; // 举个初始化例子 } }; // 这里的分号必须加!
3. 潜在的默认构造函数缺失问题
当你为结构体自定义了构造函数后,编译器就不会自动生成无参的默认构造函数了。虽然你当前的push操作用临时对象初始化没问题,但如果后续要用到std::queue的某些需要默认构造元素的操作(比如resize),就会报错。如果有需要的话,可以显式添加默认构造函数,用初始化列表的方式更高效:
struct r { bool b; int i; int j; // 显式默认构造函数 r() : b(false), i(0), j(0) {} // 自定义构造函数 r(int num1, int num2) : b(false), i(num1), j(num2) {} };
修正后的完整主函数代码
#include "my_header.h" #include <queue> int main (void) { std::queue<r> ROB; ROB.push(r(0xFFFF,1)); // 另外推荐用emplace直接在队列里构造对象,比push临时对象更高效 // ROB.emplace(0xFFFF, 1); return 0; }
内容的提问来源于stack exchange,提问作者Christophe Brown
相关产品推荐
相关产品推荐

