C++: оператор overloading - cout и Cin-ostream функция, на которую нельзя ссылаться - это удаленная функция



Я перегружал cout и Cin opeartor, и когда я попытался использовать его, он дал мне такую ошибку:



1 IntelliSense: function "std::basic_ostream<_Elem, _Traits>::basic_ostream(const     std::basic_ostream<_Elem, _Traits>::_Myt &) 
[with _Elem=char, _Traits=std::char_traits<char>]"
(declared at line 84 of "C:Program Files (x86)Microsoft Visual Studio 12.0VCincludeostream") cannot be referenced -- it is a deleted function


А вот заголовочный файл моего класса:



#pragma once
#include <iostream>

class Point2D
{
private:
int m_X;
int m_Y;
public:
Point2D(): m_X(0), m_Y(0)
{
}

Point2D(int x, int y): m_X(x), m_Y(y)
{
}

friend std::ostream& operator<< (std::ostream out, const Point2D &point)
{
out << "(" << point.m_X << "," << point.m_Y << ")" << std::endl;

return out;
}

friend std::istream& operator>> (std::istream in, Point2D &point)
{
in >> point.m_X;
in >> point.m_Y;

return in;
}

int getX() const { return m_X; }
int getY() const { return m_Y; }

~Point2D();
};


Таким образом, по сути, это просто класс, который может возвращать и задавать координаты X и Y. И я переписал операторы << и >>, чтобы упростить задачу.



Но когда я пытаюсь использовать его в основной функции, как это:



#include "stdafx.h"

#include <iostream>
#include "Point2D.h"

using namespace std;

int main(int argc, char * argv[])
{
Point2D point(7, 7);

cout << point; //there's an error here.


return 0;
}


Похоже, что ошибка в этой строке:



cout << point; 


Что именно я делаю? неправильно?

637   3  
c++

3 ответов:

Сообщение об ошибке говорит, что ostream не может быть скопировано.

friend std::ostream& operator<< (std::ostream out, const Point2D &point)
{
    ...

std::ostream out is pass-by-value : Когда operator << вызывается, компилятор пытается скопировать Аргумент. Однако std::ostream не может быть скопирован, поэтому компиляция не удалась.

Вы должны использоватьссылку .

friend std::ostream& operator<< (std::ostream &out, const Point2D &point)
{
    ...

friend std::istream& operator>> (std::istream &in, Point2D &point) 
{
    ...

(Даже если вы используете некоторые классы, которые обеспечивают копирование, вы обычно не должны использовать pass-by-val. Копирование некоторых объектов стоит так дорого;)

Просто была та же проблема. Для других народов, ищущих решение. Ошибка

function "std::basic_ostream<_Elem, _Traits>::basic_ostream(const std::basic_ostream<_Elem, _Traits> &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 83 of "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\include\ostream") cannot be referenced -- it is a deleted function

Исходит из строки:

std::ostream& operator<< (std::ostream os, const Point2D &point)

Исправьте это, и все будет хорошо:

std::ostream& operator<< (std::ostream &os, const Point2D &point)

Проблема здесь заключается в аргументах

friend std::ostream& operator<< (std::ostream out, const Point2D &point)

Входной аргумент out является передаточным значением. Когда компилятор пытается скопировать переменную std::ostream по значению, он терпит неудачу и, таким образом, ошибка. Передайте переменную out по ссылке, как показано ниже, и она должна устранить ошибку. Кроме того, возвращаемый тип является pass-by-reference, поэтому, выполнив приведенное ниже изменение, вы возвращаете тот же объект, а не создаете новую копию.

friend std::ostream& operator<< (std::ostream &out, const Point2D &point)

Полезная ссылка: Как правильно перегрузить оператор

Comments

    Ничего не найдено.