2013-10-23 107 views
2

给出错误这编写的 “嵌套模板参数列表中” 的含义是:需要帮助理解由GCC

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

请在标题中加入错误信息以提高可搜索性。一旦你这样做,你会发现它是一个重复。 –

+0

完成。感谢.. – Chani

+2

[模板内的模板:为什么“\'>>'应该是嵌套模板参数列表中的'''](http://stackoverflow.com/questions/6695261/template-within-template-为什么应该在一个嵌套的模板参数)在它自己的标题解释它。 –

回答

4

外对支架之间的东西(1)是用于std::map模板

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

的内侧的一对模板的参数列表(2)是模板参数列表std::vector模板和它的第一内侧嵌套和这就是错误所说的。

在C++ 11之前,在最后的>>之间必须有一个空格,以使分析器的生活更轻松(正如您观察到的,它将被解释为右移运算符)。许多编译器为了给出一个有意义的错误信息而努力正确地解析它,证明这并非不可能。我想这是C++ 11放宽这个限制的原因之一。

+2

@downvoter我想知道downvote的原因,所以我可以改善答案。谢谢。 – jrok

+2

@downvoter:我也想知道。 –

3

你有迂腐模式吗?它告诉你“你打算写这个”。尽管新版本的GCC(4.6 ...?)和C++ 11修复了这个问题。

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

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

这就是嵌套模板的意思。

+1

@Downvoter,为什么!? –

+0

你身处公司。所有的答案都被降低了。 –

4

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

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

这是允许在C++中,然而,在C++之前C++ 11,>>已自动标记化到右移位运算符,驱动使用像在非编译例如,无效的,因为什么符号化后的编译器看到的是

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

即它不会找到相应的结束>

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

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

+0

Hello Miss Downvotress。你会不够友好,向我解释我不幸和不知情的学者我做错了什么,所以我可以在重大考验之前及时修补这个玷污? –