0

Проблема с перегрузкой оператора <<. Реализую класс для работы с кольцевой очередью и перегружаю оператор, чтобы выводить очередь. Когда пытаюсь вызвать строку cout << B выдаёт ошибку, не подскажите, в чём тут проблема. И доп. вопрос : зачем при написании функций часто указывается const, после описания передаваемых значений (как например у меня в функции show)?

#include <fstream>
#include <iostream>
#include <string>
typedef int bufor_type;

using namespace std;

template <typename type>
class Bufor
{
private:
    type *Arr = new type;
    int Start;
    int End;
    int Arr_Size;
    bool circle;
public:
//______________________________________________________
    Bufor():Arr_Size(0),Arr(NULL),End(0),Start(0){}
    Bufor(int b_size, type *b_arr, int b_start,int b_end)
    {
        set(b_size,b_start,b_end);
        Arr = b_arr;
    }
//______________________________________________________
    void set(int b_size,int b_start,int b_end)
    {
        Arr = new type[b_size];
        Arr_Size = b_size;
        Start = b_start;
        End = b_end;
        circle = false;
    }
//_______________________________________
    void Show(ostream& stream)const
    {
            for (int i = Start; i < End-1; i=(++i)%Arr_Size) stream << Arr[i] << " ";
    }
//____________________________________________________
//operators
    friend ostream& operator<<(ostream& st, const Bufor& A);
};
template<typename type>
ostream& operator<<(const ostream& st, const Bufor<type>& A)
{
    A.show(st);
    return st;
}
int main()
{
    Bufor<bufor_type> A;
    int *temp = new int;
    Bufor<bufor_type> B(3,temp,0,0);
    A = B;
    cout << B;
    return 0;
}
Harry
  • 221,325
koshachok
  • 816

2 Answers2

2

Начните с того, что 1. исправьте объявление друга на

template<class U>
friend ostream& operator<<(ostream& st, const Bufor<U>& A);

2. уберите const из его определения:

template<typename type>
ostream& operator<<(ostream& st, const Bufor<type>& A)

3. В теле напишите A.Show(st), а не A.show(st) - С++ различает регистры...

О дополнительном const - при вызове функции-члена ей кроме аргументов в скобках неявно передается еще один - сам объект, this, грубо говоря. Это const и говорит о том, что этот объект может быть константным. Т.е., грубо говоря, функция-член обещает ничего в самом объекте не менять, кроме того, что объявлено как mutable.

Harry
  • 221,325
  • Спасибо, а зачем запись template – koshachok Apr 06 '16 at 15:48
  • Потому что так положено в C++ - это шаблонный друг, ему надо свой template<typename...> – Harry Apr 06 '16 at 15:52
  • Я имею в виду, почему передаётся class U – koshachok Apr 06 '16 at 15:54
  • @koshachok Чтобы не совпадало с type в вашем объявлении Bufor. Я обычно использую T, U, V... Вот по-привычке и написал U :) – Harry Apr 06 '16 at 15:59
  • А можно было написать typename U? Почему именно передаётся class? – koshachok Apr 06 '16 at 16:01
  • @koshachok А, да, конечно - в данном контексте эти ключевые слова абсолютно взаимозаменяемы. Дело вкуса. – Harry Apr 06 '16 at 16:08
  • 1
    @koshachok Вообще, на самом деле не обязательно объявлять именно так друга шаблонного класса, можно и без U – StateItPrimitive Apr 06 '16 at 16:09
  • @StateItPrimitive О, буду знать... Спасибо! – Harry Apr 06 '16 at 16:09
  • @Harry Да не за что. На самом деле тут раньше был один интересный вопрос, который умудрился собрать довольно неплохую базу решений несколько схожей проблемы. – StateItPrimitive Apr 06 '16 at 16:11
0
template<typename type>
ostream& operator<<(ostream& st, const Bufor<type>& A)
{
    A.show(st);
    return st;
}

const после функции означает, что функция не может изменять переменные того объекта, к которому она принадлежит. Следовательно из этой функции можно вызывать только аналогичные константные функции.

MajorMeow
  • 491