需要帮助理解 GCC 给出"within a nested template argument list"错误的含义

Need help understanding the meaning of "within a nested template argument list" error given by GCC

本文关键字:argument template list 错误 nested within 助理 帮助 GCC 给出      更新时间:2023-10-16

编译:

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抛出的错误,我不明白它想说什么。"嵌套模板参数列表"是什么意思。谢谢。

外括号对 (1) 之间的内容是模板std::map参数列表

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

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

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

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

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 及更高版本)中,允许第二次使用。

你有迂腐模式吗?它告诉你"你的意思是写这个"。尽管较新版本的GCC(4.6...?)和C++11修复了此问题。

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

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

这就是嵌套模板的含义。

相关文章: