2

そこで、次の式を使用して C++ で温度コンバーターを作成するタスクを設定しました。

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

これまでのところ、私はこれを思いつきました(最初から10行分のコメントを切り取ったので、投稿されたコードは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): エラー C2678: バイナリ '>>': 型 'std::basic_istream の左側のオペランドを取る演算子が見つかりません<_Elem,_Traits>' (または受け入れ可能な変換がない)

このエラーを取り除くために考えられることはすべて試しましたが、毎回再表示されます。これを修正する方法について何か考えはありますか?

4

2 に答える 2

9
std::cin >> farenheit >> endl;

このステートメントは無効です。それから削除>> endlします。

std::cin >> farenheit ;

coutこのステートメントは、何かがある場合にのみ有効です。ここみたいに。

std::cout << farenheit << endl ;

その理由は、endl改行を出力するために使用される行末文字だからです。したがって、出力ストリームのみがそれを受け入れます。と の戻り値とプロトタイプの詳細についてはcincoutこちらを参照してください。

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

于 2012-10-18T15:31:23.503 に答える
3

std::endlは実際には関数であり、それにストリームする演算子は定義されていません。はい、RHS ではなく LHS について不平を言っているため、紛らわしいエラー メッセージです。

その実装は次のようなものです。

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 を操作できるからです。

<iomanip>これは実際、ライブラリの動作方法と同様の概念です (ただし、オブジェクトを使用します)。

于 2012-10-18T15:33:40.320 に答える