¿Cómo pasar un vector de una clase secundaria a una función que espera un vector de clase padre?

Puedo pasar un Child a una función miembro que espera un Parent, sin embargo, cuando uso vectores obtengo un error de comstackción que dice que no hay una statement coincidente. Consulte la llamada a CorrelationEngineManager.cpp a getUniqueLabels () en la parte inferior

ServerEvent.h

#ifndef SERVEREVENT_H #define SERVEREVENT_H #define SERVEREVENT_COLS 3 #include "Event.h" #include  class ServerEvent: public Event { private: public: ServerEvent(std::vector tokens); void print(); }; #endif 

Evento.h

 #ifndef EVENT_H #define EVENT_H #include  #define EVENT_STOP 0 #define EVENT_START 1 class Event { private: protected: double time; std::string label; int type; // EVENT_START OR EVENT_STOP public: }; #endif 

CorrelationEngineManager.h

 class CorrelationEngineManager { private: std::vector s_events; std::vector u_events; std::vector s_timeRecords; std::vector u_timeRecords; // typeOfEvent gets type of event, 0 for error, look at #defines for codes int typeOfEvent(std::vector); int createTimeRecords(); std::vector getUniqueLabels(std::vector events); public: CorrelationEngineManager(); //~CorrelationEngineManager(); int addEvent(std::vector tokens); //add event given tokens void print_events(); }; 

CorrelationEngineManager.cpp

 int CorrelationEngineManager::createTimeRecords() { std::vector u_sLabels; // unique server labels std::vector u_uLabels; // unique UPS labels u_sLabels = getUniqueLabels(s_events); // u_uLabels = getUniqueLabels(u_events); return 1; } // returns a vector of unique labels, input a vector of events std::vector CorrelationEngineManager::getUniqueLabels(std::vector events) { std::vector temp; return temp; } 

Error de comstackción

  CorrelationEngineManager.cpp: In member function 'int CorrelationEngineManager::createTimeRecords()': CorrelationEngineManager.cpp:60: error: no matching function for call to 'CorrelationEngineManager::getUniqueLabels(std::vector<ServerEvent, std::allocator >&)' CorrelationEngineManager.h:23: note: candidates are: std::vector<std::basic_string<char, std::char_traits, std::allocator >, std::allocator<std::basic_string<char, std::char_traits, std::allocator > > > CorrelationEngineManager::getUniqueLabels(std::vector<Event, std::allocator >) make: *** [CorrelationEngineManager.o] Error 1 

Esto no es posible en C ++, esto requiere una característica llamada covarianza .

Incluso si el tipo A es una subclase de tipo B , el tipo X tiene X relación con el tipo X

Por lo tanto, no puede pasar std::vector a una función que espera std::vector , ya que son tipos no relacionados . Incluso pasar por referencia / puntero no funcionará.

Hay dos maneras de evitar esto.

Una sería hacer que ambos vectores mantuvieran los punteros al Event , luego tendrían tipos idénticos.

El otro, sería hacer que la función sea una función de plantilla , como sugiere Daniel.

También deberías arreglar la firma , como señala Billz.

La función se podría cambiar a una función de plantilla:

 template< typename T > std::vector getUniqueLabels(std::vector events);