Я не могу напечатать двойное значение в следующем коде? - PullRequest
0 голосов
/ 18 июня 2011
#include <iostream>
#include <iomanip>

using namespace std;

double distance(double, double);

int main ()
{
    double rate, time, distanceValue;

    cout << fixed << showpoint << setprecision(1);

    cout << "Enter rate" << endl;
    cin >> rate;

    cout << "Enter time" << endl;
    cin >> time;

    distanceValue = distance(rate, time);

    cout << "The distance is " << distanceValue << endl;
}

double distance (double num1, double num2)
{
    return num1 * num2;
}

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

следующая ошибка:

*> C: \ Users \ kifcaliph \ Desktop \ начиная с

вне с c ++ \ Chapter6> cl 06_012.cpp 06_012 Microsoft (R) 32-разрядная версия C / C ++ Оптимизация версии компилятора 16.00.30319.01 для 80x86 Copyright (C) Microsoft Corporation. Все права зарезервирован.

cl: предупреждение командной строки D9024: нераспознанный тип исходного файла «06_012», объектный файл предполагается 06_012.cpp C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xlocale (323): предупреждение C4530: используется обработчик исключений C ++, но семантика раскрутки не включена. Укажите / EHsc C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (373): ошибка C2825: '_Iter': должен быть класс или пространство имен, за которым следует '::' 06_012.cpp (20): см. Ссылку на создание шаблона класса 'std :: iterator_traits <_Iter>' существо скомпилированный с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (373): ошибка C2039: 'iterator_category': не является член 'global namespace'' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C2146: syntax error : missing ';' b efore identifier 'iterator_category' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C2602: 'std::iterator_traits<_Iter> ::iterator_category' is not a member of a base class of 'std::iterator_traits<_Iter>' with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : see declaration of 'std::iterator _traits<_Iter>::iterator_category' with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C2868: 'std::iterator_traits<_Iter> ::iterator_category' : illegal syntax for using-declaration; expected qualified-name with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(374) : error C2825: '_Iter': must be a class or namespace when followed by '::' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(374) : error C2039: 'value_type' : is not a memb er of ' глобального пространства имен' 'C: \ Program Файлы (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (374): ошибка C2146: синтаксическая ошибка: отсутствует ';' б Предыдущий идентификатор 'value_type' C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (374): ошибка C2602: 'std :: iterator_traits <_Iter> :: value_type 'не является членом базовый класс 'Станд :: iterator_traits <_Iter>' с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (374): см. Объявление 'std :: iterator _traits <_Iter> :: value_type» с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (374): ошибка C2868: 'std :: iterator_traits <_Iter> :: value_type ': недопустимый синтаксис для используя декларацию; ожидаемый Квалифицированное имя с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (375): ошибка C2825: «_Iter»: должен быть класс или пространство имен, за которым следует '::' C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (375): ошибка C2039: тип_различия: не член 'global namespace'' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(375) : error C2146: syntax error : missing ';' b efore identifier 'difference_type' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(375) : error C2602: 'std::iterator_traits<_Iter> ::difference_type' is not a member of a base class of 'std::iterator_traits<_Iter>' with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(375) : see declaration of 'std::iterator _traits<_Iter>::difference_type' with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(375) : error C2868: 'std::iterator_traits<_Iter> ::difference_type' : illegal syntax for using-declaration; expected qualified-name with [ _Iter=double ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(377) : error C2825: '_Iter': must be a class or namespace when followed by '::' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(377) : error C2039: 'pointer' : is not a member of ' глобального пространства имен' 'C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (377): ошибка C2146: синтаксическая ошибка: отсутствует ';' б Предыдущий идентификатор 'указатель' C: \ Program Файлы (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (377): ошибка C2602: 'std :: iterator_traits <_Iter> :: pointer 'не является членом базы класс 'std :: iterator_traits <_Iter>' с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (377): см. Объявление 'std :: iterator _traits <_Iter> :: указатель» с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (377): ошибка C2868: 'std :: iterator_traits <_Iter> :: pointer ': недопустимый синтаксис для используя декларацию; ожидаемый Квалифицированное имя с [ _Iter = двойной ] C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (378): ошибка C2825: '_Iter': должен быть класс или пространство имен, за которым следует '::' C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (378): ошибка C2039: «ссылка»: не является "глобального пространства имен" C: \ Program Файлы (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (378): ошибка C2146: синтаксическая ошибка: отсутствует ';' б т. е. идентификатор 'ссылка' C: \ Program Files (x86) \ Microsoft Visual Studio10.0 \ VC \ INCLUDE \ xutility (378): ошибка C2602: 'std :: iterator_traits <_Iter> :: reference' не является членом базового класса 'std :: iterator_traits <_Iter>' с [_Iter = double]C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (378): см. Объявление 'std :: iterator _traits <_Iter> :: reference' с помощью [_Iter = double] C: \ Program Files(x86) \ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xutility (378): ошибка C2868: 'std :: iterator_traits <_Iter> :: reference': недопустимый синтаксис для объявления-использования;ожидаемое квалифицированное имя с [_Iter = double]

C: \ Users \ kifcaliph \ Desktop \, начиная с c ++ \ Chapter6> *

Ответы [ 4 ]

6 голосов
/ 18 июня 2011

Я догадываюсь (так как вы даже не удосужились показать нам эти ошибки), что возникает ошибка неоднозначности между std::distance и ::distance, которая появляется из-за вашего использования директивы. Полностью квалифицируйте ::distance, чтобы заставить вашу функцию вызываться, или избавьтесь от директивы using и либо полностью квалифицируйте все, либо добавьте объявление использования для каждого из символов в пространстве имен std, которые вы намереваетесь использовать.

Кроме того, вы ошиблись distanceValue как distancValue в последней строке main.

4 голосов
/ 18 июня 2011

Вы видите неприятный побочный эффект using namespace std;. Есть функция с именем std::distance; поскольку вы использовали using namespace std;, он имеет приоритет над вашей собственной distance функцией.

Решение состоит в том, чтобы не использовать using namespace std;, а вместо этого ссылаться на std::cout, std::setprecision и т. Д. По отдельности. Вы также можете импортировать определенные идентификаторы из std:

using std::cout;
using std::setprecision;
using std::fixed;
using std::showpoint;
using std::cin;
using std::endl;

Или вы можете продолжить использовать using namespace std;, но явно запросить свой собственный distance с помощью ::distance - это запрашивает расстояние от пустого пространства имен специально (не рекомендуется; если что-то добавляется в std, это может снова сломаться) .

Кроме того, distancValue является опечаткой.

0 голосов
/ 18 июня 2011

Ошибка в том, что вы написали:

cout << "The distance is " << distancValue << endl;

вместо:

cout << "The distance is " << distanceValue << endl;

Видите ли, есть небольшое расстояние "а", которое вы пропустили, исправьте его, и оно будет хорошо работать.

И будь осторожен в следующий раз:)

0 голосов
/ 18 июня 2011

Это будет двусмысленность между std::distance и вашим ::distance - либо полностью квалифицируйте вызов, либо не включайте все пространство имен std.

...