2

这编译:

std::map<int, std::vector<int> > vDescriptorAtom;

这个:

std::map<int, std::vector<int>> vDescriptorAtom;

给出以下错误:

src/MessageHandler.cpp:191: error: >> should be > > within a nested template argument list

这显然是因为>>是一个运算符。但是看着 GCC 抛出的错误,我无法理解它想说什么。“嵌套模板参数列表”是什么意思。谢谢。

4

3 回答 3

4

外括号(1)之间的东西是模板的模板参数std::map列表

std::map<int, std::vector<int>>
// (1)  ^                     ^
// (2)                   ^   ^

内部对 (2) 是模板的模板参数列表std::vector,它嵌套在第一个参数列表中,这就是错误的意思。

在 C++11 之前,>>末尾之间必须有一个空格,以使解析器的工作更轻松(正如您所观察到的,它将被解释为右移运算符)。无论如何,许多编译器都努力正确地解析它,以便给出有意义的错误消息,证明这并非不可能。我想这就是在 C++11 中放宽此限制的原因之一。

于 2013-10-23T12:06:20.427 回答
4

你有一个嵌套的模板参数:

std::map<int, std::vector<int>>
        ^-outer---------------^
              ^-inner--------^

这在 C++ 中是允许的,但是在 C++11 之前的 C++ 中,>>会自动将其标记为右移运算符,从而使非编译示例中的用法无效,因为编译器在标记化后看到的是

[std] [::] [map] [<] [int] [,] [std] [::] [vector] [<] [int] [>>]
                open 1                           open 2           .... close?

即,它不会找到相应的关闭>

这就是错误消息试图描述的内容,包括建议的修复。在引擎盖下,编译器的这个提议意味着它实际上能够猜测你的意思,但是根据 C++2003 标准,它不允许猜测,也不允许这种用法。

在当前的 C++(C++11 和更新版本)中,允许您的第二次使用。

于 2013-10-23T12:10:06.577 回答
3

你有学究模式吗?它告诉你“你打算写这个”。尽管较新版本的 GCC(4.6...?)和 C++11 解决了这个问题。

它知道你显然是要写> >的,但如果它允许,它就不会符合标准。代码应该是可移植的,即任何 C++ 编译器都应该工作。

您在模板中有一个模板,因此是嵌套的。这很好,就像List<List<Something<int> > >一个 int 列表的列表。

这就是嵌套模板的含义。

于 2013-10-23T12:04:47.800 回答