C++代码使用cin时报no match for 'operator>>'错误是什么原因?
问题原因汇总
你现在遇到的报错和后续隐藏的所有问题如下:
- 直接触发当前报错的核心原因是函数名和变量名重名冲突:你定义了名为
hours的函数,又没有提前声明名为hours的输入变量,C++编译时在cin >> hours >> subs这一行优先识别到了hours函数,而输入流无法给一个函数对象赋值,所以直接抛出了operator>>不匹配的错误。 main函数中没有提前声明hours、subs、hours2、subs2这些用于接收输入的变量,直接调用cin接收输入属于语法错误。- 函数调用写法错误:你写的
void hours(hours, subs);是函数声明语法,不是函数调用,调用时不需要加前面的返回值类型void。 - 局部变量作用域问题:
newhours1、newhours3这些变量是定义在hours函数内部的局部变量,main函数无法直接访问,你需要修改hours函数的返回值类型,把计算得到的分钟数返回给调用方。 - 条件判断逻辑错误:
subs != "AM" || "PM"的写法永远为真,该表达式等价于(subs != "AM") || ("PM" != 0),而字符串常量"PM"的地址永远非0,所以这个判断永远成立,正确写法应该是subs != "AM" && subs != "PM"。 - 循环语法错误:
while (tries <= 50);末尾多写了分号,相当于循环体是空语句,会进入死循环,永远不会执行后面的输入提示代码。 - 变量重复定义问题:你在if/else分支里重新定义了局部变量
int i = 0和int i = 1,外层声明的int i根本没有被赋值,后续switch语句使用的是未初始化的变量,会触发未定义行为。 - switch语法不规范:case分支不需要额外加多余的花括号,且case内部定义的变量是块级局部变量,出了case分支就会被销毁,无法传递到函数外部。
- 比较运算符写错:代码里的
=>是非法运算符,正确的大于等于写法是>=。
修正后的参考代码
#include <iostream> #include <string> using namespace std; // 函数修改为返回计算得到的总分钟数,改名避免和变量重名 int convertToMinutes(double hour, string subs) { // 修正输入校验逻辑 if (hour > 12 || hour < 0 || (subs != "AM" && subs != "PM")) { int tries = 0; // 去掉多余分号,添加输入重试逻辑(这里仅做示例提示) while (tries <= 50) { cout << "please check your input.\n"; tries++; } return -1; // 输入错误返回异常值 } int i; if (subs == "AM") { i = 0; // 直接给外层变量赋值,不要重新定义 } else { i = 1; } int totalMinutes; switch (i) { case 0: totalMinutes = hour * 60; break; case 1: totalMinutes = (hour + 12) * 60; break; default: totalMinutes = -1; } return totalMinutes; } int main() { cout << "Welcome to the time convertor.\n"; // 提前声明输入变量 double hour1, hour2; string subs1, subs2; cout << "What's your initial time?\n"; cin >> hour1 >> subs1; int min1 = convertToMinutes(hour1, subs1); cout << "What's your second time?\n"; cin >> hour2 >> subs2; int min2 = convertToMinutes(hour2, subs2); // 修正比较运算符 if (min2 >= min1) { cout << "Your answer is " << min2 - min1 << "\n"; } else { cout << "Your answer is " << min1 - min2 << "\n"; } return 0; }
内容的提问来源于stack exchange,提问作者Adhishraya Sharma
相关产品推荐
相关产品推荐

