2017-06-16 73 views
1

我想刪除一個cookie,但我得到的錯誤:C++ QT刪除QNetworkCookie

error C2440: 'initializing' : cannot convert from 'const QNetworkCookie' to 'QNetworkCookie &'

我很困惑,爲什麼編譯器抱怨const QNetworkCookie(我假設它是抱怨我foreach()) 。

void PersistentCookieJar::deleteCookie(const QString cookieName) { 
    QList<QNetworkCookie> cookies = allCookies(); 
    foreach(QNetworkCookie &cookie, allCookies()) { 
     if (cookie.name() == cookieName) { 
      cookie.setValue(""); // delete the cookie 
      break; 
     } 
    } 
} 

回答

0
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); 
} 
+0

'QList QNetworkCookieJar :: allCookies()const'。所以編譯器抱怨,因爲allCookes()正在返回一個常量?我將如何改變'allCookies()'返回我的'QList'? – Jon

+0

是的,我猜它只是想讓你和setter和getters一起工作。因此,您需要複製整個列表,編輯列表,然後將Cookie設置爲新列表。在上面編輯我的答案。 – WAFFO

0

沒有爲(Q_FOREACHforeach)Qt的範圍之間的基本差異,其C++ 11的同名:不能使用Qt的一個修改的容器中的元素。

原因是Qt的實現爲每個元素返回一個常量引用,而C++ 11可以使用非const引用。在你的情況下,你試圖從一個常量(Q_FOREACH返回的那個)初始化一個引用,所以你會得到一個編譯錯誤。如您所見,它與allCookies()方法的常量無關。

如果您直接使用迭代器或索引來迭代容器,而不是使用Q_FOREACH,那麼您正在訪問實際元素,因此您可以修改它們。

這段代碼說明了一些可能的方式(錯誤的,正確的)使用Q_FOREACH(免除了簡單詳盡的迭代版本)迭代:

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; 

您可以檢查this question有關如何Q_FOREACH宏的工作更多的信息。