C ++ HowTo: не шаблонный класс, наследующий от абстрактного специализированного шаблона - PullRequest
0 голосов
/ 11 марта 2012

У меня есть нешаблонный абстрактный базовый класс, который используется для того, чтобы иметь возможность иметь ссылку на базовый тип, поскольку в качестве аргументов метода нельзя использовать неспециализированные типы шаблонов.

#ifndef RPCPP_ICALLBACKBASE_H
#define RPCPP_ICALLBACKBASE_H

#include <string>

namespace rpcpp
{
    class ICallbackBase
{
public:
    virtual ~ICallbackBase() {};
    virtual void OnSuccess(void result) = 0;
    virtual void OnError(std::string error) = 0;
};
}

#endif // RPCPP_ICALLBACKBASE_H

Абстрактный шаблонный класс ICallback наследует от базы ICallback, например, так:

#ifndef RPCPP_ICALLBACK_H
#define RPCPP_ICALLBACK_H

#include "ICallbackBase.h"

namespace rpcpp
{
template <class T>
class ICallback : public ICallbackBase
{
public:
    virtual ~ICallback() {};
    virtual void OnSuccess(T result) = 0;
    virtual void OnError(std::string error) = 0;
};
}

#endif // RPCPP_ICALLBACK_H

Наконец, можно создать конкретный тип, унаследовав от ICallback:

#ifndef RPCPP_SAMPLE_CALLBACK_H
#define RPCPP_SAMPLE_CALLBACK_H

#include "ICallback.h"
#include <iostream>

namespace rpcpp
{
class SampleCallback : public ICallback<double>
{
public:
    ~SampleCallback() {};

    virtual void OnSuccess(double result)
    {
        std::cout << "Successfully executed a remote procedure, A + B = " << result << "\r\n\r\n";
    }

    virtual void OnError(std::string error)
    {
        std::cout << "Error while executing a remote procedure: " << error << "\r\n\r\n";
    }
};
}

#endif // RPCPP_SAMPLE_CALLBACK_H

Все из которых хорошо компилируетсяОднако, когда я пытаюсь использовать это, например, так:

rpcpp::SampleCallback sc;
sic.CalculateMean(15, 28, &sc); // Third argument of this method is expected to be ICallbackBase&.

Выдает следующие две ошибки:

"не может создать экземпляр абстрактного класса" в строке # 1.«невозможно преобразовать параметр 3 из SampleCallback & в ICallbackBase &» в строке # 2

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 11 марта 2012

вы не реализуете каждый абстрактный метод:

virtual void OnSuccess (void result) = 0;

и каково определение CalculateMean?

1 голос
/ 11 марта 2012

Вот как исправить проблему:

Удалить параметр из OnSuccess:

virtual void OnSuccess()=0;

Добавить параметр конструктора в ICallback:

template<class T> class ICallBack
{
public:
   ICallBack(T &result) : result(result) { }
protected:
   T &result;
};

Добавить новыйметоды, позволяющие не шаблонному коду получать доступ к внутреннему представлению T:

virtual void *Address() const=0;
virtual size_t Size() const=0;
virtual type_info Type() const=0;

Реализация этих методов в ICallBack<T>:

void *Address() const { return &result; }
size_t Size() const { return sizeof(T); }
type_info Type() const { return typeid(T); }  
1 голос
/ 11 марта 2012
virtual void OnSuccess(void result) = 0;

никогда не определяется.

...