Печать в файл через wofstream - PullRequest
       41

Печать в файл через wofstream

1 голос
/ 03 апреля 2020

Код ниже не работает и выдает ошибку компиляции:

Код серьезности Описание Состояние подавления строки файла проекта Ошибка недопустимых операндов в двоичном выражении ('std :: wofstream' (также известный как basic_ofstream>) '))

И код:

template <class T>
void printtofile(std::string filename, int mode, T var, std::wstring msg)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << msg << L"\n";
    outfile << var << L"\n";
    outfile.close();
}

Если я закомментирую нижеприведенную строку, ошибки не будет.

    outfile << var << L"\n";

Хорошо. Странная и запутанная вещь заключается в том, что если я добавлю функцию с другими параметрами, как показано ниже, ошибки не будет, хотя я не закомментирую строку, о которой я упоминал выше:

template <class T>
void printtofile(std::string filename, int mode, T var)
{
    wofstream outfile;
    if (mode == 0) outfile.open(filename); else outfile.open(filename, ios::out | ios::app);
    outfile << var << L"\n";
    outfile.close();
}

Разве это не то же самое? ? Что здесь происходит?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вам необходимо перегрузить оператор << для типа var, а для std::string вы можете уменьшить его до строки стиля C и обойти ошибку.

Пример:

outfile<<msg.c_str()<<L"\n";

1 голос
/ 03 апреля 2020

Если outfile << var << L"\n"; не удается скомпилировать, это потому, что var относится к типу, который не имеет перегрузки, например:

std::wofstream& operator<<(std::wofstream&, const T&);

Если вы, например, попытаетесь передать std::string в функция, которая может вызвать ту же ошибку.

Чтобы сделать ошибку понятнее для пользователя функции, вы можете использовать SFINAE только для создания экземпляра шаблона для поддерживаемых типов:

template<class T>
auto printtofile(const std::string& filename, int mode, T var,
                 const std::wstring& msg)
    -> decltype(std::wofstream{} << var, void()) {
//...
}

Если вы сейчас попытаетесь использовать его с неподдерживаемым типом, ошибка будет выглядеть примерно так:

error: no matching function for call to
 ‘printtofile(..., int, <the offending type>, std::wstring&)’
...