2

親を期待するメンバー関数に子を渡すことができますが、ベクトルを使用すると、一致する宣言がないというコンパイル エラーが発生します。下部にある getUniqueLabels() への CorrelationEngineManager.cpp 呼び出しを参照してください。

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
4

2 に答える 2

3

関数はテンプレート関数に変更できます。

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

これは C++ では不可能です。これにはcovarianceと呼ばれる機能が必要です。

Atypeが type のサブクラスであっても、 typeBtypeX<A>とはまったく関係ありませんX<B>

したがって、それらは無関係な型std::vector<UPSEvent>であるため、期待する関数に渡すことはできません。参照/ポインターによる受け渡しでも機能しません。std::vector<Event>

これを回避するには 2 つの方法があります。

1 つは、両方のベクトルが へのポインターを保持するEventようにすることで、同じ型になります。

もう 1 つは、ダニエルが示唆するように、関数をテンプレート関数にすることです。

billz が指摘しているように、署名も修正する必要があります。

于 2013-02-21T01:16:18.993 に答える