`ofstream` 与 0 的比较。

8

我正在将现有的旧代码升级以使用VS 2019*,在代码中,我有以下函数,在返回行失败:

int foo(const char *fn) const
{
    ofstream out(fn,ios::binary);
    if (out)
    {
        //...
    }
    return out!=0;
}
我得到的错误是:

错误 C2678 二进制'!=':未找到接受左操作数类型为 'std::ofstream' 的运算符(或无可接受的转换)

原诗人的意图是什么,最好的解决方法是什么? *在VS 2010上这段代码可以成功编译。

2
有一种 转换为bool 的方式,所以 return (bool)out != 0; 是能编译过的。但是考虑到这个函数返回类型是 int,这样做仍然看起来毫无意义。 - Blaze
这个回答解决了你的问题吗?将流运算符>>作为布尔值进行评估 - acraig5075
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
7
我想你是在升级中,切换到C++11模式。 在C++11之前,std::basic_iosstd::basic_ofstream的基类)可以隐式转换为void*

如果fail()返回true,则返回空指针,否则返回非空指针。

然后out!=0检查流是否没有错误并准备好进行进一步的I/O操作。 自C++11以来,只有一个转换运算符可以将std::basic_ios转换为bool。请注意,该运算符被标记为explicit,因此不允许对out!=0进行隐式转换。 您可以将代码更改为!!out(调用operator!),或!out.fail(),或static_cast<bool>(out)(通过operator bool进行显式转换)。

1
难道不应该是 !out.fail() 来与其他两个相匹配吗? - n314159
@n314159 我的错。已修复。 - songyuanyao

1

std::basic_ios 类中有两个运算符可用于这种情况。它们是:

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

所以您可以例如写

return bool( out );

or

return !!out;

或者

return !out != true;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,