Невозможно сделать оператор << в классе итератора внутри другого класса - PullRequest
1 голос
/ 06 апреля 2020

Итак, у меня есть класс ArrayList, а внутри у меня есть итератор класса. Я попробовал все, чтобы сделать operator << внутри класса итератора, чтобы работать с итераторами, но ничего не работает. Я пробовал с другом и без него, в частном порядке и публично c, внутри и вне класса, мне больше нечего попробовать, поэтому, если у кого-то есть предложения, не стесняйтесь сказать: D тыый </p>

также я не знаю, есть ли что-то с моей проблемой, но ArrayList - это шаблон класса

template <typename T>
std::ostream& operator<<(std::ostream& os, const ArrayList<T>::iterator & it)
{
    return os << *it;
}

template <typename T>
class ArrayList {
private:
    T* elements_;
    size_t size_;
    size_t capacity_;
public:
class iterator;
};

template <typename T>
class ArrayList<T>::iterator {
private:
    T* ptr_;
public:
friend std::ostream& operator<<(std::ostream&, const iterator&);
};

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

ArrayList<T>::iterator является зависимым именем, поэтому перед ним должно стоять ключевое слово typename, например:

template <typename T>
std::ostream& operator<<(std::ostream& os, const typename ArrayList<T>::iterator & it) {
//                                               ^^^
    return os << *it;
}

и, конечно, ваша перегрузка operator<< должна быть определена после определения класса.

Демо

ОБНОВЛЕНИЕ

Чтобы устранить ошибки компоновки, упомянутые в комментариях, попробуйте разместить перегрузку operator<< тело прямо в тело класса, как:

template <typename T>
class ArrayList<T>::iterator {
private:
    T* ptr_;
public:
    friend std::ostream& operator<<(std::ostream& os, const iterator& it) {
        return os << *it;
    }
};
0 голосов
/ 06 апреля 2020

Я бы предпочел иметь оператор *

template <typename T> class ArrayList {
private:
    T* elements_;
    size_t size_;
    size_t capacity_;
public:
    class iterator {
    private:
        T* ptr_;
    public:
        T operator *() {return *ptr_;}
    };
};

Теперь оператор << будет работать естественным образом для любого типа T, для которого определен оператор, поэтому вам не нужно определять его самостоятельно: </p>

cout<< *it<< endl;

Оператор << будет определен только для типа T, если для него не определен оператор. Обычно вы не определяете его для int, char, string и т. Д. </p>

...