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正确性要求。
解决方案
- 将拷贝构造函数的参数改为
const cursor_list& copied_cursor_list - 拷贝时遍历原链表的指针改为
const cursor_list_node* it - 补充优化:所有不会修改对象状态的成员函数(如
is_empty、size、front_data等)都添加const修饰,符合const正确性规范。
内容的提问来源于stack exchange,提问作者Anil Celik Maral
相关产品推荐
相关产品推荐

