模板队列入队结构体对象时出现C2664错误求助
解决C2664错误:将模板结构体入队到模板队列的问题
错误根源
你在input_customer_info函数中声明了Queue<string> CI,该队列的元素类型是string,但你传入的是Customer<string>对象,类型不匹配直接触发C2664转换错误。此外代码还有几处模板逻辑和功能实现的问题,以下是分步修正方案:
1. 修正队列元素类型与生命周期问题
- 队列需要存储
Customer对象而非string,因此队列类型应改为Queue<Customer<T>> - 不能在函数内每次调用都新建队列,否则入队数据会随函数结束销毁,需将队列作为参数传入主函数维护的队列实例
2. 修复Customer结构体的无效代码
get_name函数中return语句后的cout永远无法执行,调整语句顺序:
template <class T> struct Customer { T Cname; T Cemail; T Cphnum; // 改用初始化列表更规范 Customer(T n, T e, T phn) : Cname(n), Cemail(e), Cphnum(phn) {} T get_name() { cout << Cname; return Cname; } T get_email() { return Cemail; } T get_phnum() { return Cphnum; } };
3. 修正input_customer_info函数
template <class T> void input_customer_info(T n, T e, T phn, Queue<Customer<T>>& ci_queue) { Customer<T> c(n, e, phn); ci_queue.enQueue(c); }
4. 修正主函数的队列调用逻辑
int main(){ int input = 0; // 初始化存储Customer对象的队列,若要限制容量可使用带参构造(见下文) Queue<Customer<string>> customer_queue; while (input != 1) { string nm, em, ph; cout << "Please Enter Your Name: " << endl; cin >> nm; cout << "Please Enter Your Email Address: " << endl; cin >> em; cout << "Please Enter Your Phone Number: " << endl; cin >> ph; // 传入队列引用,保证数据持久化 input_customer_info(nm, em, ph, customer_queue); cout << "Enter 1 or 0: \n1 to stop entering Customer Info, \n0 to enter more Customer Info" << endl; cin >> input; } }
5. 实现"满队列删除最早元素"的核心功能
带容量限制的链表队列
给队列添加容量和当前计数成员,入队时判断是否已满:
template <typename T> struct QNode { T data; QNode* next; QNode(T d) : data(d), next(nullptr) {} }; template <typename T> struct Queue { QNode<T>* front, * rear; int capacity; int current_size; // 带容量参数的构造函数 Queue(int cap = 10) : front(nullptr), rear(nullptr), capacity(cap), current_size(0) {} void enQueue(T x) { // 队列满时先删除队首元素 if (current_size == capacity) { deQueue(); } QNode<T>* temp = new QNode<T>(x); if (rear == nullptr) { front = rear = temp; } else { rear->next = temp; rear = temp; } current_size++; } void deQueue() { if (front == nullptr) return; QNode<T>* temp = front; front = front->next; if (front == nullptr) rear = nullptr; delete temp; current_size--; } };
修正后的数组队列
原数组队列存在int* queue与模板类型不匹配的问题,修正后实现满队列自动删除:
template <class T> struct AQueue { int front, rear; int capacity; T* queue; // 改为模板类型指针 AQueue(int c) : front(0), rear(0), capacity(c) { queue = new T[capacity]; // 分配对应类型的数组空间 } ~AQueue() { delete[] queue; } void enqueue(T data) { if (rear == capacity) { // 队列满时删除最早元素 dequeue(); } queue[rear] = data; rear++; } void dequeue() { if (front == rear) { cout << "Queue is empty\n"; return; } // 元素前移 for (int i = 0; i < rear - 1; i++) { queue[i] = queue[i + 1]; } rear--; } };
内容的提问来源于stack exchange,提问作者Malideema
相关产品推荐
相关产品推荐

