`ofstream` по сравнению с 0 - PullRequest
       10

`ofstream` по сравнению с 0

7 голосов
/ 09 января 2020

Я обновляю существующий старый код для использования VS 2019 *, в коде у меня есть следующая функция, которая не работает в обратной строке:

int foo(const char *fn) const
{
    ofstream out(fn,ios::binary);
    if (out)
    {
        //...
    }
    return out!=0;
}

Ошибка, которую я получаю is:

Ошибка C2678 двоичная '! =': не найден оператор, который принимает левый операнд типа 'std :: ofstream' (или нет приемлемого преобразования)

Каково было первоначальное намерение поэта и как лучше всего решить проблему?

* Этот код успешно компилируется на VS 2010.

Ответы [ 2 ]

7 голосов
/ 09 января 2020

Полагаю, с обновлением вы переходите в режим C ++ 11.

До C ++ 11, std::basic_ios (базовый класс std::basic_ofstream) может преобразовываться в void* неявно.

Возвращает нулевой указатель, если fail() возвращает true, в противном случае возвращает ненулевой указатель.

Затем out!=0 проверяет, нет ли в потоке ошибок и готов ли к дальнейшим операциям ввода-вывода.

Начиная с C ++ 11, существует только один оператор преобразования, который может конвертировать std::basic_ios в bool. Обратите внимание, что оператор помечен как explicit, поэтому неявное преобразование не разрешено для out!=0.

. Вы можете изменить код на !!out (вызывая operator!) или !out.fail() или static_cast<bool>(out) (явное преобразование через operator bool).

1 голос
/ 09 января 2020

В классе std::basic_ios есть два оператора, которые могут быть применены в такой ситуации. Они

explicit operator bool() const; 
bool operator!() const; 

Так что вы можете, например, написать

return bool( out );

или

return !!out;

или

return !out != true;
...