Почему моя проверка не работает в моей функции шаблона для C ?

#c #validation

Вопрос:

Я попытался создать программу, которая позволяет пользователю вводить 2 значения в виде целых чисел и 2 в виде двойников, чтобы найти максимум из двух, соответственно, используя шаблонные функции в C . Кажется, я не могу получить желаемый результат, когда пытаюсь проверить ошибку, так как она не принимает новые данные после сообщения об ошибке. Вывод обычно равен «0» после повторного ввода нового номера. Я попытался использовать код проверки из этого видео на YouTube: https://www.youtube.com/watch?v=5kqJlkQCukkamp;t=666s

Вот код, с которым я работал:

 #include<iostream>
#include<cmath>
using namespace std;

template <typename E>
void errorA(E a) {
if (!std::cin.good())
{
    cout << "nnERROR! Faulty input! Try again!n";

//clear stream
cin.clear();
std::cin.ignore(INT_MAX, 'n');

    //get input again
    cout << "Enter NUMBER again: ";
    cin >> a;

    }
  }


  template <typename T>
  void maximum(Tamp; a, Tamp; b) {

    if (a > b) {
    cout << a << " is the maximum of these 2 numbers: " << a << " amp; " << b << endl;
    }
else if (b > a) {
    cout << b << " is the maximum of the 2 numbers: " << a << " amp; " << b << endl;
}
else if (a == b) {
    cout << "Both these numbers: " << a << " amp; " << b << ", are equal! " << endl;
}

}

int main() {

int a, b;
cout << "Please enter 2 integers to find its maximum.n";
cout << "Enter 1st number: ";
cin >> a;
errorA (a);
cout << "Enter 2nd number: ";
cin >> b;
errorA( b);

 maximum(a, b);


double c, d;
cout << "nnPlease enter 2 doubles to find its maximum.n";
cout << "Enter 1st number: ";
cin >> c;
errorA(c);
cout << "Enter 2nd number: ";
cin >> d;
errorA(d);

maximum(c, d);

}
 

Комментарии:

1. ваш errorA шаблон должен возвращать новое a значение, так как вы не передаете его по ссылке.

2. Вы также должны использовать ссылочный параметр errorA(...) , как и в случае с maximum(...) (где он не нужен и должен быть удален)

Ответ №1:

Внимательно посмотрите на сигнатуру errorA метода:

 void errorA(E a);
 

Сравните его с вашей максимальной функцией:

 void maximum(Tamp; a, Tamp; b);
 

Вы видите разницу? Это в символе амперсанда ( amp; ) — это делает разницу между передачей по значению и передачей по ссылке (с amp;). errorA Чтобы работать так, как вы ожидаете, вам нужно передать по ссылке ( void errorA(Eamp; a) , чтобы значение, введенное в errorA, фактически изменяло переданную переменную, а не ее копию, локальную для функции errorA (что и происходит в настоящее время).

Обратите внимание, что функция maximum на самом деле не нуждалась бы в параметрах передачи по ссылке, так как переменные, переданные в качестве параметров, в ней не изменяются.