如何为模板参数映射声明迭代器?
我知道我可以将它作为参数传递给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 );
}
答案 0 :(得分:2)
虽然
map::iterator iter; // this is wrong
是真的。这只是因为你在对象上使用范围解析运算符,而不是指定范围的东西,比如类名或命名空间。所以这个:
typename container::iterator iter;
是对的。请注意,typename
关键字非常重要且必须使用。您必须让编译器知道您正在访问的这个依赖名称是一个类型,因此该行将被解析为声明。
答案 1 :(得分:0)
如果您能够使用C ++ 11(或更高版本)编译器,则还有几种方法可以声明iter
。
如果您可以在一个语句中声明并初始化它,则可以使用:
auto iter = map.begin();
您还可以使用decltype
推断出类型。
using iterator_type = decltype(map.begin());
iterator_type iter;
我建议使用第一种方法。处理的代码较少。在一个语句中声明和初始化变量也是一种更好的编程习惯。
答案 2 :(得分:0)
typename Container::iterator iter = ...;
编译器默认将模板成员视为变量,如果它是一个类型,你必须用&#34; typename&#34;来说明。