错误:没有运算符“!=”匹配这些操作数

时间:2016-07-27 07:05:11

标签: c++ casting

如果考虑operator !=代替<<,则可以通过添加<string>标头来删除此类错误。

但这似乎不适用于operator !=

所以,我认为可能是这个错误是由于我所比较的变量类型不同。

所以我考虑了类型转换。

这是我正在尝试做的事情:

while ( (cin >> value) != 0) { ... }

值的类型为int

我考虑的一些选项是:

  1. 静态强制转换:无法使用,因为我们在运行时接受值。
  2. 动态广告:由于value不是指针
  3. ,因此无法使用
  4. reinterpret_cast:相同
  5. 我还有其他选择吗?

    您也可以建议一些替代方案,但我想知道如何使其发挥作用。

5 个答案:

答案 0 :(得分:6)

(cin >> value)的结果值不是value的内容,而是cin的内容。 cin可以在布尔上下文中计算,但不与int进行比较,因此编译错误。

您可以修改该行(使用逗号运算符);

while ( (cin >> value, value) != 0)

这里的结果是逗号运算符的第二个操作数,因此是value。反过来,它会正确地与0进行比较。虽然这现在放弃了cin流的有效性测试。

Demo

虽然上面提到了一个最小的变化,但代码本身往往模糊不清,并且错过了一些错误检查。最好重构条件并在cin;

中提供更多错误检查
while ( (cin >> value) && (value != 0) ) {
  //...
}

Demo

答案 1 :(得分:2)

您可以编写一个函数foo(通过引用引用cin),基本上包含

cin >> value;
return value;

并写下while ((value = foo(cin)) != 0){...}foo可以利用异常机制报告读数中的任何错误。您甚至可以用 lambda 函数替换foo但实际上,这相当混淆了事情。只需接受cin >> value是带有流类型的表达式,然后使用它。

答案 2 :(得分:1)

您可以将while循环重写为for循环:

#include <iostream>

int main()
{
    int value;
    for( std::cin >> value; value != 0; std::cin >> value) {
        std::cout << value << std::endl;
    }
}

live example

答案 3 :(得分:0)

如果表达式cin >> value评估为value,您将无法执行此操作:

cin >> v1 >> v2

请记住cin >> value等同于

cin.operator>>(value);

快速查看std::istream::operator>>告诉我们它会返回std::istream&。所以cin >> v1 >> v2

cin.operator>>(v1).operator>>(v2);

istream& is = cin.operator>>(v1);
is.operator>>(v2);

您的代码:

(cin >> value) != 0

istream& is = cin.operator>>(value);
if (is != 0)  // error: comparing `istream` and `int`.

你或许可以写:

while (cin >> value, value != 0) {

此评估cin >> value,放弃结果(即cin),然后评估value != 0

#include <iostream>

int main() {
    int value;
    while (std::cin >> value, value != 0) {
        std::cout << value << '\n';
    }
}

http://ideone.com/bZ9PwJ

这会遇到这样的问题:如果你从cin那里得到一个错误的输入,你将永远陷入你的循环(http://ideone.com/JtI9fp)。

#include <iostream>

int main() {
    int value;
    while (std::cin >> value && value != 0) {
        std::cout << value << '\n';
    }
}

http://ideone.com/OjI01d

这会在错误输入和值为0的输入上退出循环。

答案 4 :(得分:0)

cin>>value返回cin 这为我们提供了使用cin>>val1>>val2的灵活性。 因此,如果我们将其用作条件,它将作为布尔值并返回True(cin>>value).
如果您希望使用cin作为条件,那么您可以使用以下方法..

int value;
while(cin>>value)
{
if(value!=0)
   cout<<"true"<<endl;
else 
   cout<<"false"<<endl;
}

这将给出正确的结果。但是如果我们使用

    int value;
while(cin>>value!=0)
{
   cout<<"True"<<endl;
}

然后它将始终作为输出给出true,因为每次变量value的值为cin>>value都会返回true