错误:传递(const A)为(this)

时间:2016-10-16 18:24:46

标签: c++ function class this pass-by-reference

我收到此错误,我不知道该怎么做。 所以我有一个链表,我正在尝试制作功能。

class Set()
{
public:
    struct Node
    {
        int value;
        Node *next;
        Node(int e, Node *n) : value(e),next(n){};
    };
    enum Exceptions{EMPTYSET, FULLMEM, REPLICA};

    Set() : _head(NULL){}
    Set(const Set& s);
    Set& operator=(const Set& s);
    ~Set();

    void pop(int e);
    void ext(int e);
    bool contains(int e);
    bool empty() const {return _head==NULL;}

    friend Set unio              (const Set& a, const Set& b);
    friend Set segment           (const Set& a, const Set& b);
    friend std::ostream& operator<< (std::ostream& s, Set& a);


private:
    Node *_head;
}

我试过的是:

Set segment(const Set& a,const Set& b)
{
Set c;
Set::Node *p = a._head;
while(p!=NULL){
    if(b.contains(p->value)){
        c.ext(p->value);
    }
    p=p->next;
}
return c;
}

ext 函数将一个元素放入集合中:

void Set::ext(int e)
{
try
{
    Node *p  = _head;
    Node *pe = NULL;
    Node *q  = new Node(e,NULL);
    while( p!=NULL && p->value < e)
    {
        pe = p;
        p = p->next;
    }

    if(pe==NULL)
    {
        q->next =_head;
        _head = q;
    }else
    {
        q->next  = p;
        pe->next = q;
    }
}catch (std::bad_alloc o)
{
    throw FULLMEM;
}
}

如果元素在集合中,则 contains 函数返回true。

bool Set::contains(int e)
{
Node *p   = _head;
while(p!=NULL){
    if(p->value == e)
        return true;
    p=p->next;
}
return false;
}

整个错误信息是:

||In function 'Set segment(const Set&, const Set&)':|
error: passing 'const Set' as 'this' argument of 'bool Set::contains(int)' discards qualifiers [-fpermissive]|

1 个答案:

答案 0 :(得分:0)

您可以将contains声明为const函数:

class Set {
   ...
   bool contains(int e) const;
   ...
}

bool Set::contains(int e) const {
   ...
}

虽然您正在使用它,但您应该对empty()执行相同操作。

有关背景阅读,请参阅Meaning of "const" last in a C++ method declaration?