2013-07-08 163 views
1

我有QHash<QString, QHash<quint64, QElapsedTimer*> myNestedQHash;,當我嘗試遍歷用foreach

foreach (QHash<quint64, QElapsedTimer*> stat, myNestedQHash.values(someStr)) 

我得到

error: macro "Q_FOREACH" passed 3 arguments, but takes just 2 

是不是有可能對他們的方式我做嵌套循環QHash嵌套QHash?

+0

這與QHash 爲統計類型定義的問題。嘗試在括號中設置,我記得有同樣的問題,但我只是不記得我解決了這個問題。 –

+0

如果我'typedef QHash statType'那麼它應該工作,但我想知道爲什麼這不起作用... – mrz

回答

2

爲什麼不使用

for (QHash<QString, QHash<quint64, QElapsedTimer*>::iterator it = myNestedQHash.begin(); it != myNestedQHash.end(); ++it) 
{...} 

呢?我認爲Q_FOREACH將創建一個副本,所以這將是更好的性能,以及...

/編輯:

在foreach只是爲Q_FOREACH宏定義...所以編譯器看到它,它將接受2個值。既然你有一個額外的逗號,它會看到3個參數。你會發現所有的信息here

+0

,你就是這樣做的,而且我也一樣循環嵌套了QHash,但我想知道爲什麼可以我使用foreach,我的意思是那裏有什麼問題,而不是如何循環嵌套的QHash。 – mrz

+1

'foreach'只是'Q_FOREACH'宏的定義...所以編譯器會看到它,它會接受2個值。既然你有一個額外的逗號,它會看到3個參數。你會在這裏找到所有的信息:http://marcmutz.wordpress.com/effective-qt/containers/;) – Zaiborg

+0

歡呼聲,把你的評論作爲編輯在你的答案,我會接受它。 – mrz

0

應該這樣工作:

QHash<QString, int> myHash0; 
myHash0["test0"]=0; 
myHash0["test1"]=1; 
QHash<QString, int> myHash1; 
myHash1["test0"]=0; 
myHash1["test1"]=1; 

QHash<QString, QHash<QString, int> > myHashList; 
myHashList["Hash0"] = myHash0; 
myHashList["Hash1"] = myHash1; 

QHash<QString, int> h; 
foreach(h , myHashList) 
{ 
    qDebug()<<h["test0"]; 
} 
+0

我有點用QString/int現在...懶惰typer :)但它應該只要你把「QHash stat''遠離foreach宏 –

0

QT foreach是一個宏。宏中的參數之間用逗號分隔,

對於您的情況,您可以使用帶有逗號的模板。

可以寫爲:

QHash<quint64, QElapsedTimer*> stat; 
foreach (stat, myNestedQHash.values(someStr))