возвращая итератор - PullRequest
       5

возвращая итератор

0 голосов
/ 22 сентября 2010

Как вернуть функцию формы итератора:

я это делаю: , ..

template<class S,class T> class Database {
public:
.
..
 map<S,Node<T>*> m_map::iterator Find (S keyToFind);
.
..
....


private:
.
..
 map<S,Node<T>*> m_map;
..
.
};

.
..
template<class S,class T>
map<S,Node<T>*> m_map::iterator Find (S keyToFind) {
 map<S,Node<T>*>::iterator itMap;
 itMap = m_map.find(KeyToUpDate);
 return itMap;
}
..
.

Есть много ошибок, потому что это: Ошибка 1 ошибка C2653: «m_map»: это не имя класса или пространства имен Ошибка 2, ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором «Найти» Ошибка 3 ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default- Ошибка 5 ошибка C2653: «m_map»: это не имя класса или пространства имен Ошибка 7 ошибка C2133: «итератор»: неизвестный размер .. ...

Я не понимаю, в чем проблема ..

Ответы [ 3 ]

6 голосов
/ 22 сентября 2010

Похоже, что вы хотите:

typename map<S,Node<T>*>::iterator

Вы должны действительно использовать typedef для очистки этого материала:

template<class S, class T>
class Database
{
public:
    // I hope you have't put `using namespace std;` in a header...
    typedef std::map<S, Node<T>*> map_type;
    typedef typename map_type::iterator iterator;
    // etc...

    // use references to avoid copying
    iterator Find (const S& keyToFind);
private:
    map_type m_map;
};
3 голосов
/ 22 сентября 2010

Ваша Find функция должна быть определена как:

template<class S,class T>
typename map<S,Node<T>*>::iterator Find (S keyToFind) {
    map<S,Node<T>*>::iterator itMap;
    itMap = m_map.find(KeyToUpDate);
    return itMap;
}

без «m_map», которое вы имели как часть типа возвращаемого значения функции.

Редактировать: Хотя на самом деле нет необходимости создавать временный itMap итератор; Вы можете вернуть результат find напрямую. Кроме того, я думаю, что KeyToUpDate должно быть вместо keyToFind. Делая эти модификации, вы получите:

template<class S,class T>
typename map<S,Node<T>*>::iterator Find (S keyToFind) {
    return m_map.find(keyToFind);
}
2 голосов
/ 22 сентября 2010

Это должно быть:

template<class S,class T>
typename map<S,Node<T>*>::iterator Find(S keyToFind) {
    typename map<S,Node<T>*>::iterator itMap;
    itMap = m_map.find(KeyToUpDate);
    return itMap;
}

и

typename map<S,Node<T>*>::iterator Find (S keyToFind);

typename необходимо, потому что iterator является зависимым типом, см., Например, здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...