解决模板类PriorityEntry的C2676错误:重载<运算符修复
问题描述
编译时触发C2676错误,提示“找不到接受const T类型右操作数的运算符(或无可行转换)”。相关代码如下:
PriorityEntry类定义
template<typename T> class PriorityEntry { public: PriorityEntry(); PriorityEntry(const int& priority, const T& data); int getPriority() const; bool operator<(const T& rhs); private: int priority; T data; };
LinkedSortedList的insertSorted方法
template<typename T> bool LinkedSortedList<T>::insertSorted(const T& entry) { Node<T>* newNode = new Node<T>(entry); Node<T>* prev = nullptr; Node<T>* curr = head; while (curr != nullptr && curr->getData() < entry) { prev = curr; curr = curr->getNext(); } if (prev == nullptr) { newNode->setNext(head); head = newNode; } else { newNode->setNext(prev->getNext()); prev->setNext(newNode); } count++; return true; }
当前operator<实现
template<typename T> bool PriorityEntry<T>::operator<(const T& rhs) { return this->priority < rhs.getPriority(); }
主程序及其他构造函数
// 主程序 int main() { LinkedPriorityQueue<PriorityEntry<string>> priorityQueue; PriorityEntry<string> entryOne(3, "Name One"); priorityQueue.enqueue(entryOne); PriorityEntry<string> entryTwo(9, "Name Two"); priorityQueue.enqueue(entryTwo); PriorityEntry<string> entryThree(2, "Name Three"); priorityQueue.enqueue(entryThree); PriorityEntry<string> entryFour(1, "Name Four"); priorityQueue.enqueue(entryFour); return 0; } // 构造函数实现 template<typename T> LinkedPriorityQueue<T>::LinkedPriorityQueue() { list = new LinkedSortedList<T>(); } template<typename T> LinkedSortedList<T>::LinkedSortedList() { count = 0; head = nullptr; } template<typename T> PriorityEntry<T>::PriorityEntry() { priority = 0; data = T(); }
修复方案
错误根源有两个:
- operator<参数类型不匹配:在
insertSorted中,curr->getData()和entry都是PriorityEntry<T>类型,但当前重载的operator<参数是const T&(即string类型),完全不匹配,导致编译器找不到合适的比较运算符。 - operator<未声明为const成员函数:调用
operator<的对象(curr->getData()返回的是const对象或const引用)无法调用非const成员函数。
具体修复步骤:
- 修改
PriorityEntry类中operator<的声明,参数改为const PriorityEntry<T>& rhs,并添加const修饰符:bool operator<(const PriorityEntry<T>& rhs) const; - 同步修改
operator<的实现,确保参数和成员函数const属性一致:template<typename T> bool PriorityEntry<T>::operator<(const PriorityEntry<T>& rhs) const { return this->priority < rhs.getPriority(); } - 确认
getPriority()的实现也是const的(类声明中已标注,实现时需保持一致):template<typename T> int PriorityEntry<T>::getPriority() const { return priority; }
修改后的完整PriorityEntry类及operator<实现
template<typename T> class PriorityEntry { public: PriorityEntry(); PriorityEntry(const int& priority, const T& data); int getPriority() const; bool operator<(const PriorityEntry<T>& rhs) const; private: int priority; T data; }; template<typename T> int PriorityEntry<T>::getPriority() const { return priority; } template<typename T> bool PriorityEntry<T>::operator<(const PriorityEntry<T>& rhs) const { return this->priority < rhs.getPriority(); }
内容的提问来源于stack exchange,提问作者xvymnp
相关产品推荐
相关产品推荐

