【问题标题】:How to compare two std::istream references?如何比较两个 std::istream 引用?
【发布时间】:2013-09-18 09:07:44
【问题描述】:

我正在将编译器从 GCC 切换到 Clang/LLVM,并遇到了我以前没有遇到过的编译错误。

我有一个看起来像这样的类:

#include <iostream>

class foo {
    public:
        bar(std::istream& is) : _fp(is), _sCheck(is != std::cin) { /* ... */ }
    private:
        std::istream& _fp;
        bool _sCheck;
}

当我编译这个文件时,clang++ 出现以下错误,其中私有变量 _sCheck 的初始化失败:

error: invalid operands to binary expression ('std::istream' (aka 
'basic_istream<char>') and 'istream' (aka 'basic_istream<char>'))

  (is != std::cin)
   ~~ ^  ~~~~~~~~

如果此地址比较中的两个对象属于同一类型,为什么clang++ 会返回错误,而g++ 不会?

我尝试使用dynamic_cast 将它们都设为std::istream&amp;,但这也返回了错误:

error: invalid operands to binary expression ('std::istream' (aka 
'basic_istream<char>') and 'std::istream')

(is != dynamic_cast<std::istream&>(std::cin))
 ~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果这是一个愚蠢的问题,我提前道歉;我很感激任何指点。

【问题讨论】:

  • 你有没有从 C++03 切换到 C++11?
  • 是的,我正在使用-std=c++11 -stdlib=libc++ 标志。
  • 我的想法是你之前点击了operator void *,这不会像你想的那样做,并且在C++11中被explicit operator bool替换。但是错误信息不匹配,所以我现在不确定。

标签: c++ gcc c++11 clang iostream


【解决方案1】:

您正在使用引用,因此您正在比较对象而不是您可能想要的指针。似乎 GCC 有一个扩展,允许您比较 std::istream 对象,但这不是 std::basic_istream 标准化接口的一部分。试试:

_sCheck(&is != &std::cin)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多