C++重载istream输入运算符报std::istream无匹配构造函数问题
错误产生原因
- 核心错误是你调用
point2D流提取运算符的写法错误:代码中的istream(input, p)会被编译器识别为尝试构造一个std::istream类型的临时对象,传入参数为input(istream&类型)和p(point2D类型),但std::istream类不存在匹配该入参列表的构造函数,因此触发构造函数匹配失败的报错。 - 额外的规范问题:你定义的
point2D的>>运算符不符合C++流运算符设计规范,返回值错误写为point2D&,标准流提取运算符必须返回std::istream&才能支持链式调用(比如input >> a >> b的写法)。 - 不符合需求的问题:你对负半径的提示信息输出到了标准输出流
cout,需求要求输出到标准错误流,需要改为cerr。
修复方案
- 先修正
point2D的>>运算符定义,调整返回值和返回内容:
istream &operator>>(istream &in, point2D &p) { char c = ' '; cout << "please input x and y coordinate : "; in >> p.x >> c >> p.y; return in; // 原返回p,改为返回输入流对象 }
- 修正
circle的>>运算符实现,替换错误的运算符调用写法,补全输入提示,调整错误输出流:
circle &operator>>(istream &input, circle &cir) { cout << "input center:" << endl; // 直接用>>运算符调用读取圆心,不需要额外定义临时point2D变量 input >> cir.center; cout << "please input radius : "; input >> cir.radius; if (cir.radius < 0) { // 改为标准错误流cerr输出提示 cerr << "in operator>> : negative radius, sign changed" << endl; cir.radius = -cir.radius; } return cir; }
内容的提问来源于stack exchange,提问作者Arif Ahmed
相关产品推荐
相关产品推荐

