我正在学习c ++模板,我有一个不同类型地图的功能:
template<typename T> void foo(T m1, T m2){ //map m1 and map m2
map<pair<T, int>, int>::iterator itr1 = m1.begin();
map<pair<T, int>, int>::iterator itr2 = m2.begin();
while (itr1 != m1.end() && itr2 != m2.end()){
//do something with itr1 and itr2
}
}
当我在VS2013中编译它时,我收到错误:error C2088: '!=' : illegal for class
,它指向while (itr1 != m1.end() && itr2 != m2.end())
。但如果我明确声明了地图的类型(即不使用模板),我没有错误。谁能告诉我这里我做错了什么?谢谢!
答案 0 :(得分:2)
std::map<pair<T, int>, int>::iterator
是地图中的迭代器,其键类型为pair<T, int>
(其中T
在您的示例中显然也是map
)且值类型为{{ 1}},明显不同于int
的类型typename T::iterator
。你可能想要的是:
m1.begin()
或者:
template<typename T>
void foo(T m1, T m2) {
typename T::iterator itr1 = m1.begin();
/* ... */
}
在第一种情况下,模板参数是template <typename T>
void foo(std::map<std::pair<T, int>, int> m1,
std::map<std::pair<T, int>, int> m2) {
typename T::iterator itr1 = m1.begin();
/* ... */
}
(map
)的类型,而在第二种情况下,它是地图键的第一个属性的类型。