Надеюсь, это заставит вас начать
Смотрите его в прямом эфире на http://ideone.com/l23He (используя stdin)
#include
#include
#include
const char* getfield(char* line, int num)
{
const char* tok;
for (tok = strtok(line, ";");
tok && *tok;
tok = strtok(NULL, ";\n"))
{
if (!--num)
return tok;
}
return NULL;
}
int main()
{
FILE* stream = fopen("input", "r");
char line[1024];
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
printf("Field 3 would be %s\n", getfield(tmp, 3));
// NOTE strtok clobbers tmp
free(tmp);
}
}
Выход:
Field 3 would be nazwisko
Field 3 would be Kowalski
Field 3 would be Nowak
1) Если функция view
определена как:
void view(std::ostream output, std::string text) // (1)
{
output << text;
}
И используется:
view(std::cout, "Hello, World!"); // (2)
Тогда сообщение об ошибке задается компилятором:
В MSVC:
blockquote>
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:
blockquote>
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:
blockquote>
error: call to deleted constructor of 'std::ostream' (aka 'basic_ostream<char>')
2) Для объявления
[1137 ] Отображается следующее сообщение об ошибке:std::ostream os;
MSVC:
blockquote>
error C2512: 'std::basic_ostream<char,std::char_traits<char>>': no appropriate default constructor available
GCC:
[ 1110]
blockquote>Clang:
blockquote>
error: calling a protected constructor of class 'std::basic_ostream<char>'
Причина:
Это все в соответствии со спецификацией std :: basic_ostream
Нет определения для конструктора по умолчанию - поэтому переменная типа
std::ostream
не может быть создана без конкретных параметров конструктора. [ 1145]И, как говорится в C ++ Reference, о конструкторе копирования std :: basic_ostream :
Конструктор копирования защищен и удален. Выходные потоки не копируются.
blockquote>
Объяснение:
1) Итак, проблема в том, что в
(2)
параметрstd::cout
был передан функции, которая определена в(1)
скопироватьstd::ostream
в переменнуюoutput
.Но определение класса говорит, что конструктор копирования не может быть использован, поэтому компилятор выдает сообщение об ошибке.
2) В случае создания переменной
os
- она не дает никаких параметров конструктора, нет конструктора по умолчанию, поэтому компилятор выдает сообщение об ошибке.
Как это исправить?
1) В объявлении функции измените определение, чтобы в качестве параметра взять ссылку (
[113 ]&
) наstd::ostream
:Это позволяет ему использовать оригинальный объект вместо копирования (что копирование запрещено).
2) Если требуется переменная, то также следует использовать ссылку;
std::ostream& out = std::cout;