需要帮助理解 GCC 给出"within a nested template argument list"错误的含义
Need help understanding the meaning of "within a nested template argument list" error given by 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抛出的错误,我不明白它想说什么。"嵌套模板参数列表"是什么意思。谢谢。
外括号对 (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> > >
,一个整数列表的列表。
这就是嵌套模板的含义。
- 表示"accepting anything for this template argument" C++概念的通配符
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 通过"Value Template Argument"与常规阵列在堆栈中分配内存
- 模板类错误的向量:"Template argument 2 is invalid"
- 如何修复错误消息,如"argument list for class template is missing"?
- C++ "argument list for class template "迭代器" is missing"错误
- 如何修复"static assertion failed: template argument not an integral type"错误?
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- "could not convert template argument"到自己的类型
- 表达式模板:错误 C2784 'could not deduce template argument'
- 需要帮助理解 GCC 给出"within a nested template argument list"错误的含义
- constexpr with std::array - "Non-type template argument is not a constant expression"
- "unspecialized class template can't be used as a template argument"是什么意思?
- MSVC:"use of class template requires template argument list" STL 容器内
- "missing template argument"是什么意思?
- std::map.insert "could not deduce template argument for..."
- "template argument deduction for class templates"是否应该推断出可变参数类模板的空参数包?