标识符'iterator'的语法错误

Syntax error for identifier 'iterator'

本文关键字:错误 语法 iterator 标识符      更新时间:2023-10-16

下面的代码会在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);

因为编译器还不知道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);
//          ^^^^^^^^