为何std::getline在主函数报错,却在其他函数可正常运行?
问题分析与解决
1. 编译错误的直接原因
你遇到的No matching function for call to 'getline'错误,核心原因是类型不匹配:std::getline的第二个参数要求是std::string&类型,但你声明的again是char类型,编译器找不到对应的函数重载。
2. 修复方案
方案一:改用std::string接收输入
将again改为string类型,通过判断输入字符串的首字符来控制循环,同时兼容用户输入空行的情况:
#include <iostream> #include <string> #include <stack> using namespace std; static int ASCII_OFFSET = 48; void postCalculator(); int main() { string again = "y"; while(again[0] == 'y'||again[0] == 'Y') { postCalculator(); cout << "Type 'Y' or 'y' to continue, or type any other letter to quit:"; getline(cin, again); // 空行默认视为退出 if(again.empty()) break; } } // 其余代码保持不变
方案二:用cin读取单个字符并清理输入流
如果坚持使用char类型,用cin读取后必须清除输入流中残留的换行符,避免后续getline读取空行:
#include <iostream> #include <string> #include <stack> #include <limits> // 需要包含此头文件使用numeric_limits using namespace std; static int ASCII_OFFSET = 48; void postCalculator(); int main() { char again = 'y'; while(again == 'y'||again == 'Y') { postCalculator(); cout << "Type 'Y' or 'y' to continue, or type any other letter to quit:"; cin >> again; // 清除输入流中所有字符直到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } } // 其余代码保持不变
3. 额外代码问题修复
你的postCalculator函数中有一处逻辑错误:
// 原错误代码 else if(i == ' ') { continue; }
这里i是循环索引(整数),不是字符内容,应该改为判断equation[i] == ' ',否则空格无法被正确跳过:
else if(equation[i] == ' ') { continue; }
内容的提问来源于stack exchange,提问作者sunlime
相关产品推荐
相关产品推荐

