我尝试编写一个程序,允许用户输入2个值作为整数和2个作为双精度,分别使用c++中的模板函数找到两者的最大值。当我试图验证错误时,我似乎无法得到我想要的结果,因为它不接受错误消息后的新输入。在重新输入新数字后,输出通常是一个'0'。我尝试使用这个YouTube视频中的验证码:666年代https://www.youtube.com/watch?v=5kqJlkQCukk& t =
下面是我一直在使用的代码:
#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(T& a, T& b) {
if (a > b) {
cout << a << " is the maximum of these 2 numbers: " << a << " & " << b << endl;
}
else if (b > a) {
cout << b << " is the maximum of the 2 numbers: " << a << " & " << b << endl;
}
else if (a == b) {
cout << "Both these numbers: " << a << " & " << 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);
}
仔细查看errorA
方法的签名:
void errorA(E a);
与您的最大函数比较:
void maximum(T& a, T& b);
你看出区别了吗?它在& (&)字符中——它区分了按值传递和按引用传递(使用&)。为了使errorA
像您期望的那样工作,您需要通过引用 (void errorA(E& a)
)传递,以便在errorA中输入的值实际上是修改传入的变量,而不是在errorA函数中复制它(这是目前发生的事情)。
注意,maximum函数实际上不需要引用传递形参,因为作为形参传入的变量在函数中没有被修改。