模板中的模板:为什么“`>>'应该是'>>'嵌套模板参数列表中的”

我知道,当我们使用的是另一种模板内的模板,我们应该把它写这样的:

vector<pair<int,int> > s;

如果我们把它写没有空白:

vector<pair<int,int>> s;

我们会得到一个错误:

`>>嵌套模板参数列表中'应该是'>>'

我认为这是可以理解的,但我不禁想知道,在这种情况下,这会真的暧昧?

--------------解决方案-------------

有时候,你希望它是 >> 。 考虑

boost::array<int, 1024>>2> x;

在C ++ 03这个成功的解析,并创建大小的数组256

它永远不会有歧义。 这是由事实证明,C ++ 0x中,你不必写收盘模板之间有一个空格>小号了。

问题是,编译器宁愿来标记输入作为上下文独立成为可能。 由于C ++是不是反正一个上下文无关的语言,将仅这一个特殊情况是不会让事情特别困难。

在当前的标准,标记化是贪心,所以>>将被处理为单个令牌,在同样的方式, a +++ b将被解析为a ++ + b 。 这已经改变,新的标准。 虽然它需要编译器实现者更多的工作,它被认为是整体它是值得的(有些市长已经编译器的实现作为一个扩展反正)。

C ++是真的非常努力,解析 - 比大多数其他语言困难得多。 它是一个非常一致的语言,但是这么多的工作被标记化的输入和理解的语法的语法分析,即东西看起来他们应该是简单的编译器,常常是不间完成。

历史悠久的“ >> ”操作符是一个操作符。 据“认定”为源文件被分成令牌。 这些标记是后来“明白”,在语法分析过程中的一些方面(经过长期标记化完成)。

如果你做语法分析,而你标记化,那么你有“帮助”,以协助该区别“ >> ”应考虑两个闭包模板声明(或定义)。 然而,这在历史上是C ++编译器而不是如何历史的工作。 (新的编译器做语法分析和标记,包括更多的“查找aheads”,以帮助解决这些模棱两可之间更多的反馈。)

是的,新的C ++ 0x标准改变了,并迫使编译器厂商重新编写他们的实现,以消除歧义“ >> ”你的情况。 因此,它永远不会含糊前进。 然而,旧的C ++编译器无法处理,所以它可能被认为是“好习惯”,保持你的代码用'之间的空间兼容>现在'字符。

这取决于编译器。 而G ++产生一个错误的Visual Studio并不强制要求这两者,即作品。 我认为,这依赖于编译器实现。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.398 (s). 10 q(s)