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的重复,因为我特别询问为什么我的编译器有时会接受>>
,但并非总是如此。
答案 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的错误。
我们很难(也有点无意义)推测出虫的来源。一个潜在的原因可能是第二个>
正在关闭不同的构造(第一种情况是关闭一个演员,第二种是关闭模板参数列表)并且解析器的实现错过了“第二>
不同结构的一部分“案例。但这只是疯狂的猜测。