не может печатать используя ostream, но может использовать cout? - PullRequest
0 голосов
/ 11 марта 2019

Пусть это будет пример кода:

object o1(//parameters);
object o2(//parameters);
object o3(//parameters);
object *v[3];

using std::cout; //video output
ofstream of;     //save on file

//let's suppose

v[0]=&o1;
v[1]=&o2;
v[2]=&o3;
for (int i=0;i<3;i++) {
    v[i]->view(cout);
    v[i]->save(of);
}

Функция просмотра - это просто функция видеопечати параметров класса, а функция сохранения сохраняет параметры класса в файле. Вопрос в том, если я объявляю std::ostream; и ostream os;, почему я не могу использовать v[i]->view(os) для вывода видео? Если я использую v[i]->view(os), он говорит:

'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected

И хотя это верно для вывода видео, для функции сохранения это не так, но работает, как и предполагалось в коде. Может кто-нибудь объяснить? извините, если я сделал это долго

1 Ответ

0 голосов
/ 18 марта 2019

Проблемы:

1) Если функция view определена как:

void view(std::ostream output, std::string text) // (1)
{
    output << text;
}

И используется:

view(std::cout, "Hello, World!"); // (2)

Тогда появляется сообщение об ошибкезадается компилятором:

В MSVC:

error C2280: 'std::basic_ostream<char,std::char_traits<char>>::basic_ostream(const std::basic_ostream<char,std::char_traits<char>> &)': attempting to reference a deleted function

GCC:

error: use of deleted function 'std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]'

Clang:

error: call to deleted constructor of 'std::ostream' (aka 'basic_ostream<char>')


2) Для декларации

std::ostream os;

следующиеотображается сообщение об ошибке:

MSVC:

error C2512: 'std::basic_ostream<char,std::char_traits<char>>': no appropriate default constructor available

GCC:

error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected within this context

Звон:

error: calling a protected constructor of class 'std::basic_ostream<char>'


Причина:

Это все в соответствии со спецификацией std :: basic_ostream

Нет определения для конструктора по умолчанию - поэтому переменная типа std::ostream не может быть создана без определенных параметров конструктора.

Ив справке C ++ говорится о std :: basic_ostream конструкторе копирования :

Конструктор копирования является профессиональными удаляется.Выходные потоки не копируются.


Объяснение:

1) Итак, проблема в том, что в (2) параметр std::cout передается функции, которая определена в (1) дляскопируйте std::ostream в переменную output.

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

2) Вслучай создания переменной os - он не дает никаких параметров конструктора, конструктор по умолчанию отсутствует, поэтому компилятор выдает сообщение об ошибке.


Как это исправить?

1) В объявлении функции измените определение, приняв в качестве параметра ссылку (&) std::ostream:

void view(std::ostream& output, std::string text) // (1)

Это позволяет использовать исходный объект вместо созданиякопия (которая не разрешена).


2) Если требуется переменная, то также должна использоваться ссылка;

std::ostream& out = std::cout;
...