&#34; vector <pair <int,int>&gt;之间有什么区别? Q;&#34;和&#34; vector <pair <int,int>&gt; Q;&#34;

时间:2015-10-17 10:02:20

标签: c++ vector

我得到前者的编译错误,但后者工作正常。

  

错误:'&gt;&gt;'应为'&gt; &gt;'在嵌套模板参数列表

谢谢

2 个答案:

答案 0 :(得分:9)

在(现已废弃)修订版C ++ 98和C ++ 03中,字符序列“&gt;&gt;”被无条件地解释为“右移运算符”标记,因此如果要关闭多个模板参数列表,则需要留下一些插入的空格。

从C ++ 11开始,语言的词汇规则已被修改为解释“&gt;&gt;”因为两个连续的模板参数列表结束,并且不再需要空格。 (但是,这使得必须在模板参数列表中括起移位表达式。)

(同样的,当用作第一个模板参数时,C ++ 11也会以“明显的”方式(参数列表的开头,后面是命名空间限定符)解释<::foo而不是消耗{ {1}}作为<:的备用标记。)

答案 1 :(得分:4)

在C ++ 11之前,你必须使用空格来分隔嵌套模板中的尖括号 - 否则编译器会将其解释为右移运算符“&gt;&gt;”。在C ++ 11中,您可以省略空格,它将被解释为括号。

但是有些编译器(例如MSVC ++)忽略了标准,即使不使用C ++ 11标准也允许你省略空格。