使用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不能编译?
答案 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方式被视为具有所有后续错误的运算符。