C++ C++;QT删除QNetworkCookie
我正在尝试删除cookie,但出现错误: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
错误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;