2016-08-23 56 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

是的,你是對的!我弄亂了模板參數。它現在有效。謝謝! –