2

我可以将 Child 传递给期望 Parent 的成员函数,但是在使用向量时出现编译错误,提示没有匹配的声明。请参阅底部对 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
4

2 回答 2

3

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

即使 typeA是 type 的子类BtypeX<A>也与 type 完全无关X<B>

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

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

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

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

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

于 2013-02-21T01:16:18.993 回答
3

该函数可以更改为模板函数:

template< typename T >
std::vector<std::string> getUniqueLabels(std::vector<T> events);
于 2013-02-21T01:17:46.680 回答