2016-08-23 3 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>::iteratorm1.begin()のタイプであるtypename T::iteratorとは明らかに異なる(Tはあなたの例で明らかにもmapである)キータイプがpair<T, int>で地図とその値型がintある、からイテレータです。あなたはおそらく必要がある:

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

はい、そうです!私はテンプレートのパラメータを混乱させました。それは今働く。ありがとう! –