双关闭尖括号(>>)在SPECIFIC情况下生成语法错误

时间:2015-03-29 15:54:05

标签: c++ eclipse templates c++11 language-lawyer

Eclipse(Luna,4.4.2)告诉我,我在下一行有一个语法错误:

static_cast<Vec<int, DIM>>(a.mul(b));

我记得双关闭尖括号>>可能会导致某些编译器出现问题,所以我在它们之间留下了空白:> >。语法错误消失。

但是我的程序中有很多>>没有检测到语法错误,例如:

Node<Element<DIM>> * e= a.get();

为什么我上面提到的具体情况会出错?这不是error: 'varName' was not declared in this scope的重复,因为我特别询问为什么我的编译器有时会接受>>,但并非总是如此。

2 个答案:

答案 0 :(得分:3)

您使用过pre c ++ 11标准编译器。较旧的标准存在一个问题,让解析器消除了>>中嵌套模板类型说明符中使用的一对结束尖括号operator>>()的歧义。因此,你必须在它们之间写一个空格。

>>>>>*这样的示例属于旧解析器的不同情况,因此它们无错误消息。


我必须承认,我实际上并不知道在c ++ 11(当前)标准定义中究竟做了什么,这种情况可以通过符合c ++ 11的标准明确消除歧义解析器。

答案 1 :(得分:1)

“直角括号修正”见§14.2[temp.names] / p3(强调我的):

  

解析 template-argument-list 时,第一个非嵌套>是   作为结束分隔符而不是大于运算符。   同样,第一个非嵌套>>被视为连续两个但是   不同的>令牌,其中第一个作为结尾    template-argument-list 并完成   模板id 。 [注意:此替换规则生成的第二个>令牌可能会终止封闭    template-id 构造或它可能是不同构造的一部分(例如演员).- 尾注]

如果static_cast在其他方面有效,那么OP中的两段代码在C ++ 11中完全有效,在C ++ 03中完全无效。如果您的IDE报告了一个错误而另一个报告错误,那么它就是该IDE的错误。

我们很难(也有点无意义)推测出虫的来源。一个潜在的原因可能是第二个>正在关闭不同的构造(第一种情况是关闭一个演员,第二种是关闭模板参数列表)并且解析器的实现错过了“第二>不同结构的一部分“案例。但这只是疯狂的猜测。