foreach没有在QPair列表上工作

huy*_*itw 8 qt

使用Qt,我想要这个代码工作:

QList<QPair<QString, QString>> list;
foreach (QPair<QString, QString> pair, list)
{
}
Run Code Online (Sandbox Code Playgroud)

相反,我得到错误:

'pair':未声明的标识符

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

typedef QPair<QString, QString> MyPair;
QList<MyPair> list;
foreach (MyPair pair, list)
{
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么第一个foreach不编译?

Shf*_*Shf 12

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

QList<QPair<QString, QString>> list;
Run Code Online (Sandbox Code Playgroud)

虽然它应该这样:

QList<QPair<QString, QString> > list;
Run Code Online (Sandbox Code Playgroud)

只需在循环外声明QPair:

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

}
Run Code Online (Sandbox Code Playgroud)

  • 当>>可以解释为operator >> overloading而不是模板括号时,它会对某些用例产生影响. (2认同)

Dmi*_*nov 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
Run Code Online (Sandbox Code Playgroud)

因为宏添加会将"DATA <int"解释为第一个参数,将"int> :: val1"解释为第二个,依此类推.

  • QPair <QString,QString>对; foreach(pair,tmplist)mainlist.append(pair); (2认同)