Программа всегда возвращает двоичный файл & gt; & gt; : оператор не найден, который принимает левый операнд типа ошибки

Итак, передо мной была поставлена ​​задача создать преобразователь температуры в 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> ‘(или нет приемлемого преобразования)

Я перепробовал все, что мог придумать, чтобы избавиться от этой ошибки, но она появляется каждый раз, есть идеи, как это исправить?

2

Решение

std::cin >> farenheit >> endl;

Это утверждение неверно. Удалить >> endl от него.

std::cin >> farenheit ;

Это утверждение действительно только тогда, когда вы cout что-то. Как здесь.

std::cout << farenheit << endl ;

Причина в том, что endl символ конца строки, используемый для вывода новой строки Так что только выходной поток принимает это. Вы можете посмотреть больше о возвращаемых значениях и прототипах cin а также cout Вот.

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

9

Другие решения

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.

Это на самом деле похожая концепция относительно того, как <iomanip> Библиотека также работает (хотя это использует объекты).

3

По вопросам рекламы [email protected]