C++ C++;QT删除QNetworkCookie

C++ C++;QT删除QNetworkCookie,c++,qt,cookies,C++,Qt,Cookies,我正在尝试删除cookie,但出现错误: 错误C2440:“初始化”:无法从“const QNetworkCookie”转换为“QNetworkCookie&” 我不明白为什么编译器会抱怨constqnetworkcookie(我假设它是在抱怨我的foreach()) void PersistentCookieJar::deleteCookie(const QString cookieName){ QList cookies=allCookies(); foreach(QNetworkCooki

我正在尝试删除cookie,但出现错误:

错误C2440:“初始化”:无法从“const QNetworkCookie”转换为“QNetworkCookie&”

我不明白为什么编译器会抱怨
constqnetworkcookie
(我假设它是在抱怨我的
foreach()

void PersistentCookieJar::deleteCookie(const QString cookieName){
QList cookies=allCookies();
foreach(QNetworkCookie&cookie,allCookies()){
if(cookie.name()==cookieName){
cookie.setValue(“”;//删除cookie
打破
}
}
}
void PersistentCookieJar::deleteCookie(const QString cookieName){
QList cookies=allCookies();
foreach(QNetworkCookie&cookie,cookie){
if(cookie.name()==cookieName){
cookie.setValue(“”;//删除cookie
打破
}
}
设置所有cookies(cookies);
}
void PersistentCookieJar::deleteCookie(const QString cookieName){
QList cookies=allCookies();
foreach(QNetworkCookie&cookie,cookie){
if(cookie.name()==cookieName){
cookie.setValue(“”;//删除cookie
打破
}
}
设置所有cookies(cookies);
}

Qt的范围(
Q_FOREACH
FOREACH
)和它的C++11同音词之间有一个基本区别:不能使用Qt的范围来修改容器的元素

原因是Qt的实现为每个元素返回一个常量引用,而C++11可以处理非常量引用。在您的例子中,您正试图从一个常量(即
Q\u FOREACH
返回的常量)初始化一个引用,因此您会得到一个编译错误。如您所见,它与
allCookies()
方法的常量无关

如果直接使用迭代器或索引来迭代容器,而不是使用
Q\u FOREACH
,那么您正在访问实际的元素,以便可以修改它们

此代码片段说明了使用
Q_FOREACH
进行迭代的一些可能方法(错误和正确)(为了简单起见,排除了详尽的迭代器版本):

QList-stringlist;//适用于任何图元类型
stringlist.append(“foo”);
//1,编译但不修改列表,因为“s”是副本
foreach(QString s,stringlist){
s+=“巴”;
}

qDebug()Qt的范围(
Q_FOREACH
FOREACH
)和它的C++11同音词之间有一个基本区别:不能使用Qt的范围来修改容器的元素

原因是Qt的实现为每个元素返回一个常量引用,而C++11可以处理非常量引用。在您的例子中,您正试图从一个常量(即
Q\u FOREACH
返回的常量)初始化一个引用,因此您会得到一个编译错误。如您所见,它与
allCookies()
方法的常量无关

如果直接使用迭代器或索引来迭代容器,而不是使用
Q\u FOREACH
,那么您正在访问实际的元素,以便可以修改它们

此代码片段说明了使用
Q_FOREACH
进行迭代的一些可能方法(错误和正确)(为了简单起见,排除了详尽的迭代器版本):

QList-stringlist;//适用于任何图元类型
stringlist.append(“foo”);
//1,编译但不修改列表,因为“s”是副本
foreach(QString s,stringlist){
s+=“巴”;
}

qDebug()
QList QNetworkCookieJar::allCookies()const
。所以编译器抱怨是因为allCookes()返回了一个常量?如何更改
allCookies()
返回我的
QList
的方式?是的,我猜它只想让你使用setter和getter。因此,您需要复制整个列表,编辑列表,然后将cookie设置为新列表。正在编辑上面的答案。
QList QNetworkCookieJar::allCookies()const
。所以编译器抱怨是因为allCookes()返回了一个常量?如何更改
allCookies()
返回我的
QList
的方式?是的,我猜它只想让你使用setter和getter。因此,您需要复制整个列表,编辑列表,然后将cookie设置为新列表。我将编辑上面的答案。
void PersistentCookieJar::deleteCookie(const QString cookieName) {
    QList<QNetworkCookie> cookies = allCookies();
    foreach(QNetworkCookie &cookie, allCookies()) {
        if (cookie.name() == cookieName) {
            cookie.setValue(""); // delete the cookie
            break;
        }
    }
}
void PersistentCookieJar::deleteCookie(const QString cookieName) {
    QList<QNetworkCookie> cookies = allCookies();
    foreach(QNetworkCookie &cookie, cookies) {
        if (cookie.name() == cookieName) {
            cookie.setValue(""); // delete the cookie
            break;
        }
    }
    setAllCookies(cookies);
}
QList<QString> stringlist; // applies to any element type
stringlist.append("foo");

// 1, compiles but doesn't modify the list since 's' is a copy
foreach (QString s, stringlist) {
  s += "bar";
}
qDebug() << stringlist;

// 2, doesn't compile ('s' is constant and cannot be modified)
/*foreach (const QString& s, stringlist) {
  s += "bar";
}*/

// 3, equivalent to 1, compiles but doesn't modify the list
foreach (auto s, stringlist) {
  s += "bar";
}
qDebug() << stringlist;

// 4 (your case), doesn't compile, 's' cannot be initialized from a constant
/*foreach (QString& s, stringlist) {
  s += "bar";
}*/

// 5, using indices
for (int ii = 0; ii < stringlist.count(); ++ii) {
  stringlist[ii] += "bar";
}
qDebug() << stringlist;

// 6, using iterators
for (auto it = stringlist.begin(); it != stringlist.end(); ++it) {
  *it += "bar";
}
qDebug() << stringlist;