【问题标题】:Program always returns binary '>>' : no operator found which takes a left-hand operand of type error程序总是返回二进制 '>>' :没有找到接受错误类型左操作数的运算符
【发布时间】:2012-10-18 15:30:03
【问题描述】:

所以我被设置了一个任务,使用这个等式在 C++ 中创建一个温度转换器:

Celsius = (5/9)*(Fahrenheit – 32)

到目前为止,我已经想出了这个(我从一开始就删掉了价值 10 行的 cmets,所以发布的代码从第 11 行开始,如果这有意义的话)

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>

using namespace std;

int main ()
{ 
float celsius;
float farenheit;

std::cout << "**************************" << endl;
std::cout << "*4001COMP-Lab5-Question 1*" << endl;
std::cout << "**************************" << endl << endl;
std::cout << "Please enter a temperature in farenheit: "; 
std::cin >> farenheit >> endl;
std::cout << "Temperature (farenheit): " << endl;
std::cout << "Temperature (celsius): " << celsius << endl;
std::cin.get();
return 0;
}

每次我尝试运行这个程序时都会遇到一堆错误,每次都会出现这个错误:

1>m:\visual studio 2010\projects\week 5\week 5\main.cpp(26): error C2678: binary '>>' : no operator found which take a left-hand operand of type 'std ::basic_istream<_elem>'(或没有可接受的转换)

我已经尝试了所有我能想到的方法来消除这个错误,但它每次都会重新出现,你知道如何解决这个问题吗?

【问题讨论】:

  • 在 cin 之后需要 endl 吗? (对不起,我的 c++ 技能现在已经尘埃落定了......)
  • 为什么是std::cout 和using namespace std;?请选择其中一个。
  • 可以使用std::endl,唯一的区别是std::endl会刷新输出缓冲区,而'\n'不会。如果您不想频繁刷新缓冲区,请使用“\n”。如果你这样做了(例如,如果你想得到所有的输出,而程序是不稳定的)。

标签: c++ temperature


【解决方案1】:
std::cin >> farenheit >> endl;

此声明无效。从中删除&gt;&gt; endl。

std::cin >> farenheit ;

此声明仅在您cout 某事时有效。喜欢这里。

std::cout << farenheit << endl ;

原因是endl是用于输出新行的结束符。所以只有输出流接受它。你可以在这里查看更多关于cin和cout的返回值和原型。

http://en.cppreference.com/w/cpp/io

【讨论】:

  • 您关于 cout 的陈述并不完全准确,endl 适用于任何 ostream&,它实际上是一个接受 ostream& 并返回一个的函数。它实现了向参数写入换行符,调用它的flush方法然后返回它。
  • 你是对的。考虑到 OP 是初学者,我没有进行完整的解释。
【解决方案2】:

std::endl 实际上是一个函数,流入它的运算符没有定义。是的,这是一条令人困惑的错误消息,因为它抱怨的是 LHS 而不是 RHS。

它的实现是这样的:

namespace std {
  std::ostream& endl( std::ostream& os )
  {
    os << '\n';
    os.flush();
    return os;
  }
}

流媒体随后定义了如下内容:

namespace std {
  std::ostream & operator<<( std::ostream & os, (std::ostream& *)(std::ostream&) func )
  {
    return func(os); // or is it (*func)(os)
  }
}

它实际上是 iostream 的一个非常“强大”的功能,因为您可以使用该签名编写一个函数并将该函数流式传输到您的流中以使用 iostream 执行操作。

这实际上与&lt;iomanip&gt; 库的工作原理类似(尽管它使用对象)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多