Пользовательский итератор для шаблона - PullRequest
0 голосов
/ 22 декабря 2011

В настоящее время я пытаюсь создать итератор для пользовательского класса, и он не очень хорошо работает: проблема, с которой я столкнулся, заключается в том, что мой пользовательский класс использует шаблон и выглядит примерно так:

template<class T>
class MyClass {
private:
    T memberVar;
};

Теперь MyClass - это в основном оболочка для memberVar, которая на данный момент является картой или картой карт.Теперь я хотел бы создать итератор в другом классе и делать с ним полезные вещи, например, обращаться к элементам на моей карте или карте карт.

Я попытался перенаправить свой итератор с моей карты, что не позволяетДайте мне ошибку в MyClass, когда я сделаю что-то вроде typedef T::iterator iterator;, но, очевидно, он не хочет быть милым со мной, когда я хочу позвонить myIterator->first, потому что теперь он больше не верит мне, что это будет работать.Честно говоря, я был удивлен, увидев, что мой typedef действительно работает.

Теперь мой вопрос: есть ли хороший способ сделать то, что я хотел бы сделать?Или я тут загнал себя в угол?Большое спасибо заранее!

Simon

Еще немного информации:

В ClassA я создаю экземпляр ClassB, который затем наследует MyClass с правильным типом T. Затем в ClassAЯ также создаю экземпляр ClassC, на который я ссылаюсь на ClassB.Теперь возникает ошибка, когда я пытаюсь создать myIterator в ClassC и пытаюсь сделать myIterator->first.

1 Ответ

1 голос
/ 22 декабря 2011

Для начала, если ваш шаблон класса всегда будет оберткой для некоторые экземпляры map, я бы повторил все typedef в std::map в вашем классе, каждый раз с:

typedef typename T::value_type;
// ...

(typename необходимо, по крайней мере, в соответствии со стандартом, но версия g ++ и скомпилируйте с ней весь свой код, даже если вы используете другой компилятор для финальной сборки.)

Что касается myIterator->first не работает, вам придется сказать мне, где эта линия произошла. Там должно быть никаких проблем, если оно находится в функция в шаблоне вашего класса, потому что функция не должна быть создается до тех пор, пока он не будет использован (и этим типом тип T известен). Если он находится за пределами шаблона класса, он все равно должен работать, при условии, что вы правильно объявили переменную, что-то вроде:

MyClass<std::map<T1, T2> >::iterator myIterator;

(В шаблоне класса просто используйте iterator, так как имя типа должно достаточно, поскольку typedef находится в области видимости.)

...