如何将Child类的向量传递给期望父类向量的函数?

时间:2013-02-21 01:14:01

标签: c++ vector parent-child

我可以将一个Child传递给一个期望父级的成员函数,但是当使用向量时,我得到一个编译错误,说没有匹配的声明。请参阅CorrelationEngineManager.cpp调用底部的getUniqueLabels()

ServerEvent.h

#ifndef SERVEREVENT_H
#define SERVEREVENT_H

#define SERVEREVENT_COLS 3

#include "Event.h"
#include <vector>


class ServerEvent: public Event {
private:

public: 
    ServerEvent(std::vector<std::string> tokens);
    void print();
};

#endif

Event.h

#ifndef EVENT_H
#define EVENT_H

#include <string>

#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<ServerEvent> s_events;
    std::vector<UPSEvent> u_events;
    std::vector<TimeRecord> s_timeRecords;
    std::vector<TimeRecord> u_timeRecords;
    // typeOfEvent gets type of event, 0 for error, look at #defines for codes
    int typeOfEvent(std::vector<std::string>);
    int createTimeRecords();
    std::vector<std::string> getUniqueLabels(std::vector<Event> events);


public:
    CorrelationEngineManager();
    //~CorrelationEngineManager();
    int addEvent(std::vector<std::string> tokens); //add event given tokens
    void print_events();
};

CorrelationEngineManager.cpp

int CorrelationEngineManager::createTimeRecords() {
    std::vector<std::string> u_sLabels; // unique server labels
    std::vector<std::string> 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<std::string> CorrelationEngineManager::getUniqueLabels(std::vector<Event> events) {

    std::vector<std::string> temp;
    return temp;
}

编译错误

 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<ServerEvent> >&)’ CorrelationEngineManager.h:23: note:
 candidates are: std::vector<std::basic_string<char,
 std::char_traits<char>, std::allocator<char> >,
 std::allocator<std::basic_string<char, std::char_traits<char>,
 std::allocator<char> > > >
 CorrelationEngineManager::getUniqueLabels(std::vector<Event,
 std::allocator<Event> >) make: *** [CorrelationEngineManager.o] Error 1

2 个答案:

答案 0 :(得分:3)

这在C ++中是不可能的,这需要一个名为协方差的功能。

即使类型AB类型的子类,类型X<A>与类型X<B>完全无关

因此,您无法将std::vector<UPSEvent>传递给期望std::vector<Event>的函数,因为它们是不相关的类型。即使通过引用传递/指针也行不通。

有两种方法可以解决这个问题。

一种方法是让两个向量保持指向Event 的指针,然后它们将具有相同的类型。

另一种方法是将函数设为模板函数,正如丹尼尔建议的那样。

你需要修复签名,正如billz指出的那样。

答案 1 :(得分:3)

该功能可以更改为模板功能:

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