map <T, T> :: итератор как тип параметра - PullRequest
4 голосов
/ 05 августа 2010

У меня есть шаблон класса с личным членом карты

template <typename T>
class MyClass
{
public:
    MyClass(){}
private:
    std::map<T,T> myMap;
}

Я хотел бы создать приватный метод, который принимает итератор для карты

void MyFunction(std::map<T,T>::iterator &myIter){....}

Однако, это получает ошибку компиляции: идентификатор 'итератор'. Мне не нужно передавать абстрактный итератор, так как MyFunction знает, что это итератор карты (и будет использоваться только в качестве интегратора для myMap), и будет обрабатывать его как таковой (доступ и изменение myIter-> second). Передачи myIter-> second в MyFunction недостаточно, так как MyFunction также должна иметь возможность ++ myIter;.

Ответы [ 3 ]

7 голосов
/ 05 августа 2010

Компилятор не знает, что std::map<T,T>::iterator является типом - это может быть что угодно, в зависимости от того, что std::map<T,T>. Вы должны указать это явно с typename std::map<T,T>::iterator.

2 голосов
/ 05 августа 2010

Вы должны использовать typename:

template <typename T>
class MyClass
{
public:
    MyClass(){}
private:
    void MyFunction(typename std::map<T,T>::iterator &myIter){....}

    std::map<T,T> myMap;
}
1 голос
/ 05 августа 2010

Вы должны добавить ключевое слово "typename" перед std :: map :: iterator в списке параметров.

...