нельзя печатать с помощью ostream, но можно с помощью cout?

Надеюсь, это заставит вас начать

Смотрите его в прямом эфире на 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

-4
задан Dave HD 11 March 2019 в 14:00
поделиться

1 ответ

Проблемы:

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;
[1137 ] Отображается следующее сообщение об ошибке:

MSVC:

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

GCC:

[ 1110]

Clang:

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


Причина:

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

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

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

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


Объяснение:

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

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

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


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

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

[113 ]

Это позволяет ему использовать оригинальный объект вместо копирования (что копирование запрещено).


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

std::ostream& out = std::cout;
0
ответ дан Robert Andrzejuk 11 March 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: