ошибка: нет соответствующей функции для вызова ‘std :: vector <x>:: push_back (y &) в C ++ - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующий код:

Vehicle.h:

#pragma once

class Vehicle
{
    public:
        Vehicle();
        ~Vehicle();

    private:
        int wheels;
};

Car.h:

#pragma once

#include "Vehicle.h"

class Car: public Vehicle
{
    public:
        Car();
        ~Car();

    private:
        int wheels=4;
};

ParkingLot.h:

#pragma once

#include <vector>
#include <string>
#include "ParkingSpace.h"
#include "HandicappedParkingSpace.h"

class ParkingLot
{
    public:
        ParkingLot();
        ~ParkingLot();

        void ParkVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps);

        void ReleaseVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps);

        void getOccupiedSpaces();


    private:
        int value;

        std::vector <HandicappedParkingSpace> occupied_handicapparkingspaces;
        std::vector <HandicappedParkingSpace> vacant_handicapparkingspaces;
};

ParkingLot.cpp:

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include "ParkingLot.h"


ParkingLot::ParkingLot() {
    for (int i=0; i<5; i++) {
        HandicappedParkingSpace HPS(1, nullptr);
        vacant_handicapparkingspaces.push_back(HPS);
    }

    std::cout<<"finished parking lot"<<std::endl;
}


void ParkingLot::ParkVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps)
{
    if (ps=="Handicapped") {
        if (vacant_handicapparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_handicapparkingspaces.pop_back();
            occupied_handicapparkingspaces.push_back(_ps);
        }
        else
        {
            std::cout<<"No handicapped spaces available"<<std::endl;
        }
    }

}


void ParkingLot::ReleaseVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps)
{
    //_ps.vacant=1;
    //_ps.vehicle= nullptr;
    _ps.setVehicle(1, nullptr);

    if (ps=="Handicapped") {
        if (occupied_handicappparkingspaces.size()!=0) {
            vacant_handicapparkingspaces.push_back(_ps);
            occupied_handicapparkingspaces.pop_back();
        }
        else {
            std::cout<<"Unable to release any handicapped spaces"<<std::endl;
        }
    }
}

void ParkingLot::getOccupiedSpaces() {
    std::cout<<"Occupied handicap spaces: "<<occupied_handicapparkingspaces.size()<<std::endl;
    std::cout<<"Vacant handicap spaces: "<<vacant_handicapparkingspaces.size()<<std::endl;

}

ParkingSpace.h:

#pragma once

#include "Vehicle.h"

class ParkingSpace
{
    public:
        ParkingSpace();
        ~ParkingSpace();
        virtual void parkvehicle(Vehicle *v)=0;
        virtual void setVehicle(bool vacant, Vehicle* _v);


    private:
        Vehicle* vehicle;
        bool vacant; 

};

HandicappedParkingSpace.h:

#pragma once

#include "ParkingSpace.h"

class HandicappedParkingSpace : public ParkingSpace
{
    public:
        HandicappedParkingSpace(int _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }

        ~HandicappedParkingSpace();

        void parkvehicle(Vehicle* _v) {
            this->vacant=0;
            this->vehicle=_v;
        }

        void setVehicle(bool _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle= _v;
        }


    private:
        int vacant;
        Vehicle* vehicle;

};

main.cpp

#include "ParkingLot.h"
#include "HandicappedParkingSpace.h"
#include "Car.h"
#include <iostream>


int main()
{
    ParkingLot PL;
    Car* c1;
    HandicappedParkingSpace HPS(1, nullptr);
    PL.ParkVehicle(c1, HPS, "Handicapped");
    //Car* c2;
    //CompactParkingSpace CPS(1, nullptr);
    //PL.ParkVehicle(c2, CPS, "Handicapped");

    PL.getOccupiedSpaces();

    std::cout<<"FINISHED"<<std::endl;
    //delete d;
        return 0;
}

Это дает следующую ошибку

ParkingLot.cpp:1:9: warning: #pragma once in main file
 #pragma once
         ^~~~
ParkingLot.cpp: In member function ‘void ParkingLot::ParkVehicle(Vehicle*, ParkingSpace&, std::__cxx11::string)’:
ParkingLot.cpp:34:48: error: no matching function for call to ‘std::vector<HandicappedParkingSpace>::push_back(ParkingSpace&)’
    occupied_handicapparkingspaces.push_back(_ps);
                                                ^
In file included from /usr/include/c++/7/vector:64:0,
                 from ParkingLot.cpp:5:
/usr/include/c++/7/bits/stl_vector.h:939:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = HandicappedParkingSpace; _Alloc = std::allocator<HandicappedParkingSpace>; std::vector<_Tp, _Alloc>::value_type = HandicappedParkingSpace]
       push_back(const value_type& __x)
       ^~~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:939:7: note:   no known conversion for argument 1 from ‘ParkingSpace’ to ‘const value_type& {aka const HandicappedParkingSpace&}’
/usr/include/c++/7/bits/stl_vector.h:953:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = HandicappedParkingSpace; _Alloc = std::allocator<HandicappedParkingSpace>; std::vector<_Tp, _Alloc>::value_type = HandicappedParkingSpace]
       push_back(value_type&& __x)
       ^~~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:953:7: note:   no known conversion for argument 1 from ‘ParkingSpace’ to ‘std::vector<HandicappedParkingSpace>::value_type&& {aka HandicappedParkingSpace&&}’
ParkingLot.cpp: In member function ‘void ParkingLot::ReleaseVehicle(Vehicle*, ParkingSpace&, std::__cxx11::string)’:
ParkingLot.cpp:76:46: error: no matching function for call to ‘std::vector<HandicappedParkingSpace>::push_back(ParkingSpace&)’
    vacant_handicapparkingspaces.push_back(_ps);
                                              ^
In file included from /usr/include/c++/7/vector:64:0,
                 from ParkingLot.cpp:5:
/usr/include/c++/7/bits/stl_vector.h:939:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = HandicappedParkingSpace; _Alloc = std::allocator<HandicappedParkingSpace>; std::vector<_Tp, _Alloc>::value_type = HandicappedParkingSpace]
       push_back(const value_type& __x)
       ^~~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:939:7: note:   no known conversion for argument 1 from ‘ParkingSpace’ to ‘const value_type& {aka const HandicappedParkingSpace&}’
/usr/include/c++/7/bits/stl_vector.h:953:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = HandicappedParkingSpace; _Alloc = std::allocator<HandicappedParkingSpace>; std::vector<_Tp, _Alloc>::value_type = HandicappedParkingSpace]
       push_back(value_type&& __x)
       ^~~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:953:7: note:   no known conversion for argument 1 from ‘ParkingSpace’ to ‘std::vector<HandicappedParkingSpace>::value_type&& {aka HandicappedParkingSpace&&}’

Может ли кто-нибудь помочь с этим?

РЕДАКТИРОВАТЬ :

Забыли включить CompactParkingSpace.ParkingLot.h должно быть:

#pragma once

#include <vector>
#include <string>
#include "ParkingSpace.h"
#include "HandicappedParkingSpace.h"
#include "CompactParkingSpace.h"
#include "RegularParkingSpace.h"

class ParkingLot
{
    public:
        ParkingLot();
        ~ParkingLot();



        void ParkVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps);

        void ReleaseVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps);

        void getOccupiedSpaces();


    private:
        int value;

        std::vector <HandicappedParkingSpace> occupied_handicapparkingspaces;
        std::vector <HandicappedParkingSpace> vacant_handicapparkingspaces;
        std::vector <CompactParkingSpace> occupied_compactparkingspaces;
        std::vector <CompactParkingSpace> vacant_compactparkingspaces;
};

ParkingLot.cpp должно быть

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include "ParkingLot.h"


ParkingLot::ParkingLot() {
    for (int i=0; i<5; i++) {
        HandicappedParkingSpace HPS(1, nullptr);
        vacant_handicapparkingspaces.push_back(HPS);
    }
    /*
    for (int i=0; i<5; i++) {
        CompactParkingSpace CPS(1, nullptr);
        vacant_compactparkingspaces.push_back(CPS);
    }
    std::cout<<"finished parking lot"<<std::endl;
}


void ParkingLot::ParkVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps)
{
    if (ps=="Handicapped") {
        if (vacant_handicapparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_handicapparkingspaces.pop_back();
            occupied_handicapparkingspaces.push_back(_ps);
        }
        else
        {
            std::cout<<"No handicapped spaces available"<<std::endl;
        }
    }

    else if  (ps=="Compact") {
        if (vacant_compactparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.pop_back();
            occupied_compactparkingspaces.push_back(_ps);
        }
        else
        {
            std::cout<<"No compact spaces available"<<std::endl;
        }
    }


}


void ParkingLot::ReleaseVehicle(Vehicle* _v, ParkingSpace& _ps, std::string ps)
{
    //_ps.vacant=1;
    //_ps.vehicle= nullptr;
    _ps.setVehicle(1, nullptr);

    if (ps=="Handicapped") {
        if (occupied_handicapparkingspaces.size()!=0) {
            vacant_handicapparkingspaces.push_back(_ps);
            occupied_handicapparkingspaces.pop_back();
        }
        else {
            std::cout<<"Unable to release any handicapped spaces"<<std::endl;
        }
    }

    else if  (ps=="Compact") {
        if (occupied_compactparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.push_back(_ps);
            occupied_compactparkingspaces.pop_back();
        }
        else {
            std::cout<<"Unable to release any compact spaces"<<std::endl;
        }
    }

}

void ParkingLot::getOccupiedSpaces() {
    std::cout<<"Occupied handicap spaces: "<<occupied_handicapparkingspaces.size()<<std::endl;
    std::cout<<"Vacant handicap spaces: "<<vacant_handicapparkingspaces.size()<<std::endl;
    std::cout<<"Occupied compact spaces: "<<occupied_compactparkingspaces.size()<<std::endl;
    std::cout<<"Vacant compact spaces: "<<vacant_compactparkingspaces.size()<<std::endl;
}

CompactParkingSpace.h:

#pragma once

#include "ParkingSpace.h"

class CompactParkingSpace : public ParkingSpace
{
    public:
        CompactParkingSpace(int _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }
        ~CompactParkingSpace();

        void parkvehicle(Vehicle* _v) {
            this->vacant=0;
            this->vehicle=_v;

        }

        void setVehicle(bool _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle= _v;
        }

    private:
        int vacant;
        Vehicle* vehicle;


};

1 Ответ

1 голос
/ 06 марта 2019

Хотя код содержит много ошибок, первая ошибка, которую вы получаете

ParkingLot.cpp: In member function ‘void ParkingLot::ParkVehicle(Vehicle*, 
ParkingSpace&, std::__cxx11::string)’:
ParkingLot.cpp:34:48: error: no matching function for call to 
‘std::vector<HandicappedParkingSpace>::push_back(ParkingSpace&)’
occupied_handicapparkingspaces.push_back(_ps);

потому что вы пытаетесь вставить ParkingSpace в вектор, который занимает HandicappedParkingSpace с. Если вы храните указатели, вы можете вставить HandicappedParkingSpace* в вектор, содержащий ParkingSpace* с, но (как говорили другие комментаторы) даже тогда вы не сможете сделать обратное.

Возможно, вы захотите просмотреть этот список для некоторых книг, чтобы помочь вам лучше понять наследство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...