#c #templates #iterator
#c #шаблоны #итератор
Вопрос:
#include <iostream>
#include <map>
#include <vector>
template<typename T>
class foo {
public:
foo(T val) : m_Value(val) { };
T get_value() const { return m_Value; };
void set_value(const Tamp; t) { m_Value=t; };
bool operator<(const foo<T>amp; x) { return x.get_value() < m_Value; };
bool operator==(const foo<T>amp; x) { return x.get_value() == m_Value; };
private:
T m_Value;
};
template<typename T>
class bar {
public:
bar() { };
void print_first() const {
typename std::map<foo<T>,std::vector<foo<T> > >::iterator it;
it = m_Map.begin(); //ERROR!
std::cout << it->first.get_value() << std::endl;
};
private:
std::map<foo<T>,std::vector<foo<T> > > m_Map;
};
int main() {
bar<int> b;
b.print_first();
return 0;
};
Я пытаюсь написать контейнер, но функции-члены требуют использования итератора, но когда я пытаюсь фактически использовать итератор, я получаю ошибку:
testcase.cpp: In member function `void bar<T>::print_first() const [with T =
int]':
testcase.cpp:33: instantiated from here
testcase.cpp:24: error: no match for 'operator=' in 'it = std::map<_Key, _Tp,
_Compare, _Alloc>::begin() const [with _Key = foo<int>, _Tp =
std::vector<foo<int>, std::allocator<foo<int> > >, _Compare =
std::less<foo<int> >, _Alloc = std::allocator<std::pair<const foo<int>,
std::vector<foo<int>, std::allocator<foo<int> > > > >]()'
/usr/include/c /3.3.3/bits/stl_tree.h:184: error: candidates are:
std::_Rb_tree_iterator<std::pair<const foo<int>, std::vector<foo<int>,
std::allocator<foo<int> > > >, std::pair<const foo<int>,
std::vector<foo<int>, std::allocator<foo<int> > > >amp;, std::pair<const
foo<int>, std::vector<foo<int>, std::allocator<foo<int> > > >*>amp;
std::_Rb_tree_iterator<std::pair<const foo<int>, std::vector<foo<int>,
std::allocator<foo<int> > > >, std::pair<const foo<int>,
std::vector<foo<int>, std::allocator<foo<int> > > >amp;, std::pair<const
foo<int>, std::vector<foo<int>, std::allocator<foo<int> > >
>*>::operator=(const std::_Rb_tree_iterator<std::pair<const foo<int>,
std::vector<foo<int>, std::allocator<foo<int> > > >, std::pair<const
foo<int>, std::vector<foo<int>, std::allocator<foo<int> > > >amp;,
std::pair<const foo<int>, std::vector<foo<int>, std::allocator<foo<int> > >
>*>amp;)
Что я делаю не так?
Заранее спасибо.
Ответ №1:
print_first
это const
метод. Следовательно, член m_Map
также является const
, и его begin
метод возвращает не обычный iterator
, а const_iterator
. Изменить
typename std::map<foo<T>,std::vector<foo<T> > >::iterator it;
Для
typename std::map<foo<T>,std::vector<foo<T> > >::const_iterator it;
и вы должны быть готовы к работе.
Комментарии:
1. хороший вызов, я пропустил
const
ключевое слово в методе. Для справки, я бы по-прежнему широко использовалtypedef
orauto
при работе с шаблонным кодом, чтобы сделать вещи более удобочитаемыми.