Ошибки при попытке перегрузить оператор класса шаблона друг <<

avatar
TomatoLV
8 апреля 2018 в 00:29
65
1
0

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

Template <class T>
class SafeArray {

private:
    int size;
    int elements;
    int index;
    T* arr;

public:

    SafeArray(int n);
    ~SafeArray();
    void push_back(T item);
    void resize(int size);
    friend std::ostream& operator << (std::ostream& os, const SafeArray<T>& ar)


};

И реализация вне класса:

template<class T>
std::ostream& operator << <T> (std::ostream& os, const SafeArray<T> & arr) {

    for (int i = 0; i < arr.elements; i++) {
        std::cout << arr[i] << " ";
    }

    std::cout << std::endl;

    return os;
}
Источник

Ответы (1)

avatar
songyuanyao
8 апреля 2018 в 00:34
0

Если вы хотите шаблон друга, объявление friend должно быть

template <class T>
class SafeArray {
    ...
    template<class X>
    friend std::ostream& operator << (std::ostream& os, const SafeArray<X>& ar);
};

реализация должна быть

template<class T>
std::ostream& operator << (std::ostream& os, const SafeArray<T> & arr) {
    ...
}

ЖИВОЙ

Кстати: в реализации operator<< я думаю, что std::cout << arr[i] << " "; должно быть std::cout << arr.arr[i] << " ";.

TomatoLV
8 апреля 2018 в 00:37
0

Я сделал это, но все равно получаю ошибки: ошибка C3646: «T»: неизвестное спецификатор переопределения. Примечание: см. ссылку на создание экземпляра шаблона класса «SafeArray<T>» при компиляции ошибка C2988: неузнаваемая ошибка объявления/определения шаблона C2059: синтаксическая ошибка: '&' ошибка C2334: неожиданный токен(ы) перед '{'; пропуск видимого тела функции

songyuanyao
8 апреля 2018 в 00:41
0

@TomatoLV Есть и другие проблемы, посмотрите живую демонстрацию, которую я опубликовал.