Проблемы:
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;