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

C++向vector存自定义类时报discards qualifiers错误如何解决

错误现象

尝试将自定义类anil::cursor_list的实例存入std::vector容器时,编译抛出如下错误:

error: binding 'const anil::cursor_list' to reference of type 'anil::cursor_list&' discards qualifiers
 { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
触发报错的代码片段
std::vector<anil::cursor_list> strongly_connected_components;
anil::cursor_list strongly_connected_component_list;
strongly_connected_components.push_back(strongly_connected_component_list);
自定义类声明
#include <cstddef>
#include <iostream>

namespace anil {
  class cursor_list_node {
    private:
      int data;
      cursor_list_node* next;
      cursor_list_node* previous;
      friend class cursor_list; 
  };

  class cursor_list {
    private:
      // 数据成员
      int m_index;
      int m_size;
      cursor_list_node* front;
      cursor_list_node* back;
      cursor_list_node* cursor;
      
      int m_backup_index;
      cursor_list_node* backup_cursor;

      // 内部函数
      void delete_list();

    public:
      cursor_list() : m_index(-1), m_size(0), front(nullptr), back(nullptr),
        cursor(nullptr), m_backup_index(-1), backup_cursor(nullptr) {}
      cursor_list(cursor_list& copied_list);
      bool is_empty();
      int size();
      int index();
      int front_data();
      int back_data();
      int cursor_data();
      bool operator==(cursor_list& rhs); // rhs = 右操作数
      cursor_list& operator= (cursor_list& rhs);  // rhs = 右操作数
      friend std::ostream& operator<<(std::ostream& out, cursor_list& rhs); // rhs = 右操作数
      void clear();
      void move_cursor_front();
      void move_cursor_back();
      void move_cursor_prev();
      void move_cursor_next();
      void save_cursor_state();
      void restore_cursor_state();
      void prepend(int new_data);
      void append(int new_data);
      void insert_before_cursor(int new_data);
      void insert_after_cursor(int new_data);
      void delete_front();
      void delete_back();
      void delete_cursor();
      ~cursor_list();
  };
}
拷贝构造函数实现
cursor_list() : m_index(-1), m_size(0), front(nullptr), back(nullptr),
        cursor(nullptr), m_backup_index(-1), backup_cursor(nullptr) {}

anil::cursor_list::cursor_list(cursor_list& copied_cursor_list) {
  this->m_index = -1;
  this->m_size = 0;
  this->front = nullptr;
  this->back = nullptr;
  this->cursor = nullptr;
  this->m_backup_index = -1;
  this->backup_cursor = nullptr;
  if (copied_cursor_list.is_empty() == false) {
    for (cursor_list_node* it = copied_cursor_list.front; it != nullptr;
         it = it->next) {
      this->append(it->data);
    }
  }
}
问题原因

C++标准要求拷贝构造函数的参数必须为常量左值引用,std::vector内部执行元素拷贝操作时,会传入带const限定的原对象。你定义的拷贝构造函数参数是无const修饰的cursor_list&,无法接收const类型的实参,绑定时会丢失const限定符,直接触发编译错误。
另外拷贝构造函数中调用的is_empty()等成员函数也未添加const修饰,调用const对象的非const成员函数同样不符合const正确性要求。

解决方案
  1. 将拷贝构造函数的参数改为const cursor_list& copied_cursor_list
  2. 拷贝时遍历原链表的指针改为const cursor_list_node* it
  3. 补充优化:所有不会修改对象状态的成员函数(如is_empty、size、front_data等)都添加const修饰,符合const正确性规范。

内容的提问来源于stack exchange,提问作者Anil Celik Maral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:54:01