双右尖括号 (>>) 在特定情况下会产生语法错误

Double closing angle brackets (>>) generate syntax error in SPECIFIC case

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

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

我记得双右尖括号 >> 会导致某些编译器出现问题,所以我在中间放了一个空格:> >。语法错误消失。

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

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

为什么在上述特定情况下会出现错误?这不是 的副本,因为我特别想问为什么我的编译器有时会接受 >>,但并非总是如此。

您已经使用了 c++11 之前的标准编译器。旧标准在让解析器消除来自 operator>>() 的嵌套模板类型说明符中使用的一对右尖括号 >> 时存在问题。因此你必须在它们之间写一个space。

>>>>>* 等示例属于旧解析器的不同情况,因此它们可以正常工作而不会出现错误消息。


我不得不承认,我实际上并不知道 c++11(当前)标准定义中到底做了什么,这种情况可以用 c++ 清楚地消除歧义11 兼容解析器。

"right angle bracket fix" 可在 §14.2 [temp.names]/p3(强调我的)中找到:

When parsing a template-argument-list, the first non-nested > is taken as the ending delimiter rather than a greater-than operator. Similarly, the first non-nested >> is treated as two consecutive but distinct > tokens, the first of which is taken as the end of the template-argument-list and completes the template-id. [ Note: The second > token produced by this replacement rule may terminate an enclosing template-id construct or it may be part of a different construct (e.g. a cast).—end note ]

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

的错误

我们很难(而且有点毫无意义)推测错误的来源。一个潜在的原因可能是第二个 > 正在关闭不同的构造(第一个案例是关闭一个强制转换,第二个是关闭一个模板参数列表)并且解析器的实现不知何故错过了 "second > being part of a different construct" 案例。但这只是疯狂的猜测。