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

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

本文关键字:gt 在特定情况下 语法 错误      更新时间:2023-10-16

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

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

我记得双闭角括号>>可能会导致某些编译器出现问题,所以我在两者之间加了一个空白:> >。语法错误消失。

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

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

为什么我会在上述特定情况下出错?这不是重复错误:';varName';没有在这个范围内声明,因为我特别问为什么我的编译器有时会接受>>,但并不总是。

您使用了c++11之前的标准编译器。旧的标准在让解析器从operator>>()中消除嵌套模板类型说明符中使用的一对闭角括号>>的歧义时遇到了问题。因此,你不得不在它们之间写一个空格。

>>>>>*这样的样本属于旧解析器的不同情况,因此它们在没有错误消息的情况下工作。


我必须承认,我实际上不知道在c++11(当前)标准定义中到底做了什么,这种情况可以通过符合c++11的解析器来清楚地消除歧义

"直角括号固定"见§14.2[临时名称]/p3(emphasis mine):

当解析模板参数列表时,第一个非嵌套的>是用作结束分隔符,而不是大于运算符。类似地,第一个非嵌套的>>被视为两个连续但不同的>令牌,其中第一个作为模板参数列表并完成模板id。[注意:此替换规则生成的第二个>令牌可能会终止封闭模板id构造,或者它可能是不同构造的一部分(例如,强制转换)--尾注]

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

我们很难(也有点毫无意义)推测错误的来源。一个潜在的原因可能是第二个>正在关闭不同的构造(第一种情况是关闭强制转换,第二种情况是打开模板参数列表),解析器的实现不知何故错过了"第二个>是不同构造的一部分"的情况。但这只是疯狂的猜测。