我尝试从无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
,我不明白为什么会出现问题。
答案 0 :(得分:4)
您对const
指针和指向const
的指针感到困惑。
removeOne
期望的是指针(即Item*
);对于参数声明,const
在指针上有资格但不是指针对象(即Item* const &
,对非const Item
的const指针的引用。你传递的是指向const
(即const Item*
)的指针,它无法隐式转换为指向非const的指针。
将pC
的类型更改为Item*
或Item* const
可以解决问题。