9

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

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

相反,我得到了错误:

'pair' : 未声明的标识符

使用 atypedef我可以让它工作,但这不是我想要的(除非这是唯一有效的东西):

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

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

4

3 回答 3

14

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

QList<QPair<QString, QString>> list;

虽然它应该这样:

QList<QPair<QString, QString> > list;

只需在循环外声明 QPair :

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

}
于 2013-04-19T12:27:27.690 回答
11

不能在包含多个模板参数的 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

因为宏 add 会将“DATA< int”解释为第一个参数,将“int >::val1”解释为第二个参数,依此类推。

于 2013-04-19T12:39:53.317 回答
0

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

 QList<QPair<QString, QString>> list;

在这样的声明中没有给出错误,主题施法者错误的原因是不同的,并且确实与声明必须在 foreach() 循环之外完成的事实有关。这在 QT 文档中有解释。

关于 >> 和 >>... 这是老故事,最新的 GCC(所以 linux/mac)认为这是一个语法错误,因为它不符合标准。>> 在 GCC 方式中被视为具有所有后续错误的操作员..

于 2013-04-19T17:13:16.280 回答