You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模板队列入队结构体对象时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:09:46