提问人:Philipp Penalber 提问时间:2/26/2020 最后编辑:Philipp Penalber 更新时间:2/27/2020 访问量:144
错误:我的类的“operator>>”不匹配
error: no match for ‘operator>>’ for my class
问:
我有一个错误,说:
error: no match for ‘operator>>’ (operand types are ‘std::ifstream {aka std::basic_ifstream<char>}’ and ‘const int*’)
inputStream >> getZipcode();
当我包含并且我没有使用运算符重载函数时,所以我不明白这个问题。我还有一张纸条,上面写着:#include <iostream>
#include <fstream>
In file included from /usr/include/c++/7/iostream:40:0,
from Strings.h:5,
from Sensor.h:5,
from Car.h:4,
from Agency.h:4,
from Agency.cpp:2:
/usr/include/c++/7/istream:168:7: note: candidate: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
operator>>(bool& __n)
^~~~~~~~
/usr/include/c++/7/istream:168:7: note: conversion of argument 1 would be ill-formed:
Agency.cpp:79:29: error: cannot bind non-const lvalue reference of type ‘bool&’ to an rvalue of type ‘bool’
inputStream >> getZipcode();
此功能应该为租车代理机构提供数据,其中包括代理机构的名称和邮政编码。然后读取“库存”或该机构拥有的汽车数据,例如:品牌、型号、车主、年份、传感器和基本价格。
这是我的 Agency 头文件和我在单独的源文件上的 getZipcode() 实现:
class Agency {
private:
char m_name[256];
int m_zipcode[5];
Car m_inventory[5];
public:
Agency();
//~Agency();
const char *getName();
const int *getZipcode();
void setName(const char *name);
void setZipcode(const int *zipcode);
const Agency &operator[](const int index);
void readData();
void printData();
void printAvailableCars();
};
const int *Agency::getZipcode() {
return m_zipcode;
}
void Agency::readData() {
ifstream inputStream;
char inputfile[50];
const int *tempZip = getZipcode();
Car *tempInvt = m_inventory;
char tempMake[256], tempModel[256], tempOwner[256], tempType[256];
int tempYear;
float tempBaseprice;
bool tempAvailable;
Sensor tempSensor[3];
Sensor *sensorPtr = tempSensor;
cout << "Enter file name: ";
cin >> inputfile;
inputStream.open(inputfile);
if (inputStream.is_open()) {
inputStream >> m_name;
for (int i = 0; i < 5; i++) {
inputStream >> getZipcode();
tempZip++;
}
for (int j = 0; j < 5; j++) {
inputStream >> tempYear;
inputStream >> tempMake;
inputStream >> tempModel;
inputStream >> tempBaseprice;
tempInvt->setYear(tempYear);
tempInvt->setMake(tempMake);
tempInvt->setModel(tempModel);
tempInvt->setBaseprice(tempBaseprice);
inputStream.get();
while (inputStream.peek() != '}') {
inputStream >> tempType;
sensorPtr->setType(tempType);
if (myStringCompare(tempType, "gps") == 0) {
sensorPtr->setExtracost(5.0);
sensorPtr->getGps_cnt() + 1;
}
else if (myStringCompare(tempType, "camera") == 0) {
sensorPtr->setExtracost(10.0);
sensorPtr->getCamera_cnt() + 1;
}
else if (myStringCompare(tempType, "lidar") == 0) {
sensorPtr->setExtracost(15.0);
sensorPtr->getLidar_cnt() + 1;
}
else if (myStringCompare(tempType, "radar") == 0) {
sensorPtr->setExtracost(20.0);
sensorPtr->getRadar_cnt() + 1;
}
else {
sensorPtr->setExtracost(0.0);
}
sensorPtr++;
}
inputStream.get();
tempInvt->updatePrice();
inputStream >> tempAvailable;
inputStream >> tempOwner;
tempInvt->setAvailable(tempAvailable);
tempInvt->setOwner(tempOwner);
}
tempInvt++;
}
}
[1]: https://i.stack.imgur.com/G2XNv.png
答:
0赞
KamiJuanmi
2/26/2020
#1
该错误来自于尝试将 istream 与指针一起使用,设计中还有另一个错误,不建议使用 get 来更改类的内部数据,因此最好编写一个 set 函数。我假设您正在尝试逐个数字读取邮政编码号码,并且它是一个 4 位数字。但是,如果您不想这样做,请给我更多信息和代码。
int aux_Zip[4];
for (int i = 0; i < 5; i++) {
inputStream >> aux_Zip[i];
}
setZipCode(aux_Zip);
评论
0赞
463035818_is_not_an_ai
2/26/2020
您不需要循环来读取 4 位数字。实际上,如果文件确实包含一个 4 位数字,那么已经读取了所有 4 位数字inputStream >> aux_Zip[0];
0赞
463035818_is_not_an_ai
2/26/2020
顺便说一句,我也不能同意“不建议使用 get 来更改类的内部数据”。当然,getter 会得到一些不设置的东西,但有时 getter 会做一些簿记,然后他们确实修改了内部成员,我看不出这有什么不好
0赞
463035818_is_not_an_ai
2/26/2020
或者考虑类的延迟计算私有成员,相应的 getter 将在必要时首先检索该值,将其存储在内部,然后返回它
0赞
KamiJuanmi
2/26/2020
好的,首先是循环,这完全取决于输入的格式,我假设格式是 4 4 4 4,所以正如我所说,信息很少。关于get的问题,我所有的老师都说,我们必须确保类数据成员的封装。
0赞
463035818_is_not_an_ai
2/26/2020
如果问题不清楚,那么最好要求澄清,而不是根据猜测来回答。其次,我的反驳论点与封装没有对比。相反,如果在 getter 中修改私有封装的成员,则这是封装。
-1赞
geoidiot
2/26/2020
#2
getZipcode()
是对返回 .从 inputStream 中读取整数(邮政编码)并尝试将其存储在函数调用中没有任何意义。const int*
如果您想从文件中读取邮政编码,这将起作用:
int *tempZip = getZipcode();
if (inputStream.is_open()) {
inputStream >> m_name;
inputStream >> tempZip;
}
如果要从输入流中提取邮政编码,则不能是 .int *tempZip
const
如前所述,更好的解决方案是直接读取 ,而不使用 .int
int*
int tempZip = getZipcode(); // not sure what getZipcode() should do
if (inputStream.is_open()) {
inputStream >> m_name;
inputStream >> tempZip;
}
评论
0赞
463035818_is_not_an_ai
2/26/2020
在什么情况下,从流中读取 A 有意义(假设它会起作用)?int*
0赞
geoidiot
2/26/2020
这是原始帖子中给定的数据类型(是的,它有效)。错误不是来自指针,而是他试图提取到 .这不会被覆盖,例如尝试提取到 a 是行不通的。const int*
const int
0赞
463035818_is_not_an_ai
2/26/2020
很难想象从文件中读取 A 是 OP 真正想要的。int*
0赞
Philipp Penalber
2/27/2020
你好!我刚刚在我的问题中添加了更多信息。对不起,没有说清楚。
0赞
geoidiot
2/27/2020
为什么需要邮政编码的 getter 和 setter 函数?就足够了。你为什么用它来读取邮政编码?const int*
int
inputStream >> getZipcode();
评论
inputStream >> getZipcode();
std::string
std::string
std::vector
std::array
std::swap
)