【问题标题】:Syntax error for identifier 'iterator'标识符“迭代器”的语法错误
【发布时间】:2016-08-10 15:04:15
【问题描述】:

以下代码在 VS 2013 中引发两个编译器错误:

  1. 模板函数定义抛出

    错误 C2061:语法错误:标识符 'iterator'

  2. 该模板函数的特化抛出

    错误 C2912:显式特化“double getFillIn<double,double>(fillInOptions,double,std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>,inputLoader *,va_list)”不是函数模板的特化

谁能解释一下为什么?我相当肯定第二个错误只是第一个错误的结果,但我不明白为什么它无法找出 iterator 标识符。

#include <map>

template <typename T> class table {
};

template <typename S, typename T>
void f(S s, std::map<S, table<T>*>::iterator it);

【问题讨论】:

  • 试试typename map&lt;rngT, lookupTable&lt;T&gt;*&gt;::iterator
  • 我错了,但是在完全定义lookupTable 之前template class lookupTable&lt;double&gt;; 会咬你。题外话:开关中的默认情况不返回任何内容。如果有无效的或新的opt 偷偷溜进来,对编译器警告和一些更糟糕的调试很有好处。

标签: c++ dictionary syntax iterator std


【解决方案1】:

因为编译器还不知道std::map&lt;S, table&lt;T&gt;*&gt; 的类型,它还不知道std::map&lt;S, table&lt;T&gt;*&gt;::iterator 是一个类型(它可能是一个成员)。你需要告诉它它是一个类型,使用 typename 关键字:

template <typename S, typename T>
void f(S s, typename std::map<S, table<T>*>::iterator it);
//          ^^^^^^^^

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多