cout << 1 << 2 << 3 << 4;
Таким образом, это работает как ряд вызовов, с двумя аргументами например
(((cout << 1) << 2) << 3) << 4;
что примерно эквивалентно следующему:
cout << 1;
cout << 2;
cout << 3;
cout << 4;
Таким образом, вы не пишете operator<<
принимать несколько параметров, она всегда принимает два операнда, левый операнд и правый операнд. Левый операнд в приведенном выше примере равен cout
, то есть ostream
, а правый операнд - int
. Оператор возвращает левый операнд, позволяя ему снова использоваться в следующей операции и т. Д. Для всего количества операций <<
, когда вы соединяетесь вместе.
Так cout << 1
возвращает cout
снова, таким образом, что (cout << 1) << 2
вызывает оператор, чтобы написать 1 в поток и возвращает поток, затем вызывает оператор снова на возвращаемом значении для записи 2 в поток, а затем возвращает поток снова.
Это просто нонсенс:
friend int operator<<(const int &x, const int &y)
{
data += x;
data += y;
}
Где data
должен взялось? Функция друга не является членом класса, поэтому нет указателя this
, поэтому нет this->data
, также вы утверждаете, что возвращаете int
, но ничего не возвращаете, и этот класс полностью не связан с Test
. То, что вы написали, - это operator<<
для двух целых чисел, например для 1 << 2
, но этот оператор уже существует, это оператор с битрейтом, и вы не можете перегружать его для встроенных типов, например int
.
Вы хотите:
class Test
{
private:
int data;
public:
Test() { data = 0; }
void print() { cout << data; }
Test& operator<<(int y)
{
data += x;
return *this;
}
};
Или в другом:
class Test
{
private:
int data;
public:
Test() { data = 0; }
void print() { cout << data; }
friend Test& operator<<(Test& t, int y)
{
t.data += x;
return t;
}
};
Ваш оператор для тестового класса не только для целых чисел. он должен быть членом не другом. – aggsol
Возьмите один параметр. Верните ссылку на * this; –