双右尖括号 (>>) 在特定情况下会产生语法错误
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" 案例。但这只是疯狂的猜测。
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" 案例。但这只是疯狂的猜测。