2

我正在将编译器从 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&,但这也返回了错误:

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

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

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

4

1 回答 1

7

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

_sCheck(&is != &std::cin)
于 2013-09-18T09:09:29.007 回答