оператор недопустим для класса в шаблонной функции

Я изучаю шаблоны 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()), Но если я явно объявляю тип карт (то есть не использую шаблон), у меня нет ошибки. Кто-нибудь может сказать мне, что я здесь делаю не так? Спасибо!

-3

Решение

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>>) в то время как во втором случае это тип первого атрибута ключа карты.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]