C 迭代器从Typedef std :: Map作为模板参数声明

C++ Iterator declare from typedef std::map as template argument

本文关键字:声明 参数 Map 迭代器 Typedef std      更新时间:2023-10-16

如何声明迭代器的模板参数图?

我知道我可以从主要函数作为另一个模板参数的参数传递,但是如果我不这样做,我该如何声明?

template< typename container >
int print_data( container map )
{
    map::iterator iter; // this is wrong
    return 0;
}
int main()
{
    typedef std::map< int, double > Map;
    Map new_map;
    print_data< Map >( new_map );
}

map::iterator iter; // this is wrong

是真的。这仅仅是因为您在对象上使用范围分辨率运算符,而不是指定范围的内容,例如类名称或名称空间。因此:

typename container::iterator iter;

是正确的。注意typename关键字很重要和强制性。您必须让编译器知道您要访问的相关名称是一种类型,因此该行将被解析为声明。

如果您能够使用C 11(或以后)编译器,则有几种声明iter的方法。

  1. 如果您可以在一个语句中声明并初始化它,则可以使用:

    auto iter = map.begin();
    
  2. 您也可以使用decltype推断出类型。

    using iterator_type = decltype(map.begin());
    iterator_type iter;
    

我建议使用第一种方法。这是处理的代码较少。这也是一个更好的编程习惯,可以在一个语句中声明和初始化变量。

typename Container::iterator iter = ...;

编译器默认值将模板成员视为变量,如果是类型,则必须使用" TypeName"。