Я изучаю шаблоны 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())
, Но если я явно объявляю тип карт (то есть не использую шаблон), у меня нет ошибки. Кто-нибудь может сказать мне, что я здесь делаю не так? Спасибо!
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();
/* ... */
}
В первом случае параметр шаблона является типом map
(T = std::map<std::pair<T, int>>
) в то время как во втором случае это тип первого атрибута ключа карты.
Других решений пока нет …