类型'Item * const'的引用无法绑定到'const Item *'类型的右值

时间:2018-03-14 07:38:03

标签: c++ list qt pointers const

我尝试从无const项列表中禁止const项指针:

#include <QString>
#include <QList>

class Item {
public:
    Item(QString name) : _name(name) {
    }
private:
    QString _name;
};

class Product {
public:
    Product(const Item * item) : _item(item) {
    }

    const Item * item() {
        return _item;
    }

    void setItem(const Item * item) {
        _item = item;
    }
private:
    const Item * _item;
};

int main() {
    QList<Item*> listOfNonConstItem;
    listOfNonConstItem.append(new Item("a"));
    listOfNonConstItem.append(new Item("b"));

    Product product(listOfNonConstItem.first());
    listOfNonConstItem.removeOne(product.item());

    return 0;
}

不幸的是,编译器失败了:

/path/to/main.cpp:34:31: error: reference to type 'Item *const' could not bind to an lvalue of type 'const Item *'
    editableList.removeOne(pC);
                           ^~
/path/to/Qt/5.6.3/clang_64/lib/QtCore.framework/Headers/qlist.h:201:29: note: passing argument to parameter 't' here
bool removeOne(const T &t);
                        ^

由于removeOne()参数为const,我不明白为什么会出现问题。

1 个答案:

答案 0 :(得分:4)

您对const指针和指向const的指针感到困惑。

removeOne期望的是指针(即Item*);对于参数声明,const在指针上有资格但不是指针对象(即Item* const &,对非const Item的const指针的引用。你传递的是指向const(即const Item*)的指针,它无法隐式转换为指向非const的指针。

pC的类型更改为Item*Item* const可以解决问题。