运算符在模板函数中对类非法

时间:2016-08-23 07:17:29

标签: c++

我正在学习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())。但如果我明确声明了地图的类型(即不使用模板),我没有错误。谁能告诉我这里我做错了什么?谢谢!

1 个答案:

答案 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)的类型,而在第二种情况下,它是地图键的第一个属性的类型。