C ++错误:将const传递为'这个'争论

时间:2014-05-08 22:45:12

标签: c++ templates linked-list operator-overloading

这是一个链接列表,我试图超载==,它给了我错误:错误:传递' const Linked_List为'此&# 39; &ItemH的参数LinkedList :: Element(int)[with ItemType = int]'丢弃限定符。

我必须检查两个链表是否具有相同数量的元素,以及每个元素是否成对相等。

错误指向==的实现部分 这是摘录: P.S:element(i)返回链表的i位置的值

template <typename ItemType>
bool Linked_List <ItemType>::operator == (const Linked_List &eq)const {
    if (eq.Items != Items){
        return false;
    }
    if (eq.Items == 0){
        return true;
    }
    for (int i = 0; i < eq.Items; i++){
        if (eq.Element(i) != Element(i)){     //error points here
            return false;
        }
    }
    return true;
}

这是我的其余代码可能相关的。我没有发布我的所有代码,因为一切正常,包括element(),只有重载不会起作用。

//.h
template <typename ItemType>
class Node
{
    public:
        ItemType Data;
        Node <ItemType> *next;
};

template <typename ItemType>
class Linked_List
{
    public:   
        Node <ItemType> *start;
        int Items;
        Linked_List();
        ItemType Element(int num);
        bool operator == (const Linked_List &eq)const;
}

.//cpp
#include "Linked_List.h"
template <typename ItemType>
Linked_List <ItemType>::Linked_List(){
    start = NULL;
    Items = 0;
}
template <typename ItemType>
ItemType Linked_List <ItemType>::Element(int num){
    ItemType result = 0;
    if (start == NULL){
        return result;
    }
    Node <ItemType> *nnode;
    nnode = start;
    int current_position = 0;
    while (current_position < num){
        current_position++;
        nnode = nnode -> next;
    }

    result = nnode -> Data;
    nnode = NULL;
    delete nnode;
    return result;
}
template <typename ItemType>
bool Linked_List <ItemType>::operator == (const Linked_List &eq)const {
    if (eq.Items != Items){
        return false;
    }
    if (eq.Items == 0){
        return true;
    }
    for (int i = 0; i < eq.Items; i++){
        if (eq.Element(i) != Element(i)){      //error
            return false;
        }
    }
    return true;
}

int main(){
    Linked_List <int> test8;
    Linked_List <int> test7;
    cout << (test8 == test7) << endl;
}

1 个答案:

答案 0 :(得分:5)

声明为const的方法只能调用其他const方法。它们不能是非const方法。在您的情况下,方法operator ==被声明为const。在operator ==内部,您试图调用方法Element,这是非常量的。这是你的错误。

此外,两个Element都在

中调用
if (eq.Element(i) != Element(i))

无效。第一个调用无效,因为eqconst引用,这意味着您无法通过它调用任何非const方法。由于上述原因,第二次通话无效。

要么将Element方法声明为const,要么提供第二个const版本的Element以及非常量版本const。我看到你的元素按值返回结果 ,这意味着你可以简单地将它声明为{{1}}。