错误:我的类的“operator>>”不匹配

error: no match for ‘operator>>’ for my class

提问人:Philipp Penalber 提问时间:2/26/2020 最后编辑:Philipp Penalber 更新时间:2/27/2020 访问量:144

问:

我有一个错误,说:

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
C++ 错误处理 运算符重载 fstream iostream

评论

2赞 463035818_is_not_an_ai 2/26/2020
请提供一个最小的可重现示例和完整的错误消息
0赞 Lukas-T 2/26/2020
您无法从 istream 读取指针。应该做什么?inputStream >> getZipcode();
0赞 Philipp Penalber 2/27/2020
@idclev463035818 我添加了更多信息
0赞 463035818_is_not_an_ai 2/27/2020
为什么不使用 for 字符串?std::string
1赞 463035818_is_not_an_ai 2/28/2020
其中一部分是要理解你不需要字符串或数组的指针,因为你可以使用 和 / 。原始指针在现代 C++ 中很少见。编写一个交换函数(例如)将是指针的有效用例,但即使如此,您也宁愿使用引用,甚至更好地使用已经存在的东西(std::stringstd::vectorstd::arraystd::swap)

答:

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 *tempZipconst

如前所述,更好的解决方案是直接读取 ,而不使用 .intint*

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*intinputStream >> getZipcode();