2016-08-23 50 views
-3

我学习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

请发布[MCVE](http://stackoverflow.com/help/mcve) –

回答

2

std::map<pair<T, int>, int>::iterator是从地图哪个键的类型是pair<T, int>(其中T是显然也是一个map在你的例子),并且值类型是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(); 
    /* ... */ 
} 

在第一种情况下,模板参数是mapT = std::map<std::pair<T, int>>)的类型,而在第二种情况下它的类型地图的关键字的第一个属性。

+0

是的,你是对的!我弄乱了模板参数。它现在有效。谢谢! –