ошибка: нет совпадения с оператором >> для моего класса - PullRequest
0 голосов
/ 26 февраля 2020

У меня ошибка, которая говорит:

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();

Что эта функция предназначена для данных Агентства по прокату автомобилей, включая название агентства и почтовый индекс. А затем прочитайте «инвентарь» или данные об автомобилях, которые Агентство имеет, такие как: марка, модель, владелец, год, датчик и базовая цена.

Вот мой заголовочный файл агентства и моя реализация для 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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

getZipcode() - это вызов функции, которая возвращает const int*. Нет смысла читать целое число (почтовый индекс) из вашего inputStream и пытаться сохранить его в вызове функции.

Это будет работать, если вы хотите прочитать почтовый индекс из файла:

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 голосов
/ 26 февраля 2020

Эта ошибка возникает при попытке использовать istream с указателем, есть другая ошибка в дизайне, не рекомендуется использовать get для изменения внутренних данных класса, поэтому вам лучше запрограммировать функцию set. Я предположил, что вы пытаетесь прочитать номер ZipCode по номеру и его номер 4 di git. Но если вы не пытаетесь это сделать, дайте мне больше информации и кода.

int aux_Zip[4];
for (int i = 0; i < 5; i++) {
    inputStream >> aux_Zip[i];
}
setZipCode(aux_Zip);
...