foreach没有在QPair列表上工作

时间:2013-04-19 12:03:22

标签: qt

使用Qt,我希望这段代码能够正常工作:

QList<QPair<QString, QString>> list;
foreach (QPair<QString, QString> pair, list)
{
}

相反,我得到错误:

  

'pair':未声明的标识符

使用typedef我可以使它工作,但这不是我想要的(除非这是唯一可行的):

typedef QPair<QString, QString> MyPair;
QList<MyPair> list;
foreach (MyPair pair, list)
{
}

有谁可以解释为什么第一个foreach不能编译?

3 个答案:

答案 0 :(得分:11)

这不是foreach错误。这是声明错误。你声明了这样的列表:

QList<QPair<QString, QString>> list;

虽然它应该这样:

QList<QPair<QString, QString> > list;

只需在循环之外声明QPair:

QPair<QString,QString> pair;
foreach(pair,list){

}

答案 1 :(得分:10)

在qt foreach语句中使用包含多个模板参数的模板类是不可能的,因为逗号分隔符与宏内的逗号分隔符冲突。

#define add( a, b ) (a + b)

template < typename T1, typename T2 >
struct DATA
{
  static const T1 val1 = 1;
  static const T2 val2 = 2;
};

// Usage
const int c = add( 1, 2 ); // OK
const int d = add( DATA< int, int >::val1 , DATA< int, int >::val2 ); // FAIL

因为宏添加会将“DATA&lt; int”解释为第一个参数,将“int&gt; :: val1”解释为第二个,依此类推。

答案 2 :(得分:0)

以上答案的一些解释......如果您的编译器接受

 QList<QPair<QString, QString>> list;

对此类声明没有任何错误,主题连接符错误的原因是不同的,实际上与声明必须在foreach()循环之外完成的事实有关。 QT文档中对此进行了解释。

关于&gt;&gt;和&gt; &gt; ...那个老故事和最新的GCC(所以linux / mac)认为它是一个语法错误,因为它不符合标准。 &GT;&GT;以GCC方式被视为具有所有后续错误的运算符。