You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:15:01