标识符“迭代器”的语法错误

God*_*ius -2 c++ syntax dictionary iterator std

以下代码在 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);
Run Code Online (Sandbox Code Playgroud)

Tob*_*ght 7

因为编译器还不知道 的类型std::map<S, table<T>*>,所以它还不知道它std::map<S, table<T>*>::iterator是一个类型(它可能是一个成员)。您需要使用关键字告诉它它将是一种类型typename

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