编译:
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抛出的错误,我无法理解它想说的是什么。 “嵌套模板参数列表”是什么意思。谢谢。
答案 0 :(得分:4)
外部括号对(1)之间的东西是std::map
模板
std::map<int, std::vector<int>>
// (1) ^ ^
// (2) ^ ^
内部对(2)是std::vector
模板的模板参数列表,它在第一个内部是嵌套,这就是错误所说的内容。
在C ++ 11之前,最后>>
之间必须有一个空格,以便使解析器更容易生存(正如您所观察到的那样,它将被解释为右移运算符)。许多编译器都努力正确地解析它,以便给出有意义的错误消息,证明这并非不可能。我想这就是C ++ 11中放宽这种限制的原因之一。
答案 1 :(得分: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及更新版本)中,允许第二次使用。
答案 2 :(得分:3)
你有迂腐模式吗?它告诉你“你打算写这个”。虽然较新版本的GCC(4.6 ......?)和C ++ 11解决了这个问题。
它知道你显然打算写> >
,但如果它允许它就不符合标准。代码应该是可移植的,即任何C ++编译器都应该可以工作。
模板中有模板,因此嵌套。这很好,就像List<List<Something<int> > >
一样,列出了一些int的列表。
这就是嵌套模板的意思。