c++ - 如何将子类的 vector 传递给需要父类 vector 的函数?

标签 c++ vector parent-child

我可以将 Child 传递给需要 Parent 的成员函数,但是当使用 vector 时,我收到一个编译错误,指出没有匹配的声明。请参阅底部对 getUniqueLabels() 的 CorrelationEngineManager.cpp 调用

服务器事件.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

事件.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

关联引擎管理器.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();
};

关联引擎管理器.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

最佳答案

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

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

因此你不能通过 std::vector<UPSEvent>到一个期待 std::vector<Event> 的函数,因为它们是不相关的类型。即使通过引用/指针传递也不起作用。

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

一个方法是让两个 vector 都持有指向Event的指针,那么它们将具有相同的类型。

另一种方法是使该函数成为模板函数,正如 Daniel 所建议的。

正如 billz 指出的那样,您还需要修复签名

关于c++ - 如何将子类的 vector 传递给需要父类 vector 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992961/

相关文章:

c++ - 这个插值搜索实现有什么问题?

matlab - 在 MATLAB 中按行向量右除

mysql - 在单个查询中按顺序获取父子的有序列表(MySQL)

properties - Vue组件设置child的数据值

c++ - C2143 : syntax error : missing ';' before '*'

C++ vector 内存分配和运行时?

c++ - 什么是 multimap::emplace() 和 move()?

python - sklearn中CountVectorizer(binary=True)和n CountVectorizer(binary=False)有什么区别

类错误的 C++ vector

mysql - 在 MySQL 中,如何以最有效的方式编写此 SQL 查询?