C ++ Iterator从typedef std :: map声明为模板参数

时间:2017-12-07 07:06:56

标签: c++

如何为模板参数映射声明迭代器?

我知道我可以将它作为参数传递给main函数作为另一个模板参数,但是如果我不这样做,我怎么能声明呢?

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 );
}

3 个答案:

答案 0 :(得分:2)

虽然

map::iterator iter; // this is wrong

是真的。这只是因为你在对象上使用范围解析运算符,而不是指定范围的东西,比如类名或命名空间。所以这个:

typename container::iterator iter;

是对的。请注意,typename关键字非常重要且必须使用。您必须让编译器知道您正在访问的这个依赖名称是一个类型,因此该行将被解析为声明。

答案 1 :(得分:0)

如果您能够使用C ++ 11(或更高版本)编译器,则还有几种方法可以声明iter

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

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

    using iterator_type = decltype(map.begin());
    iterator_type iter;
    
  3. 我建议使用第一种方法。处理的代码较少。在一个语句中声明和初始化变量也是一种更好的编程习惯。

答案 2 :(得分:0)

typename Container::iterator iter = ...;

编译器默认将模板成员视为变量,如果它是一个类型,你必须用&#34; typename&#34;来说明。