C++HowTo:从抽象专用模板继承的非模板类

C++ HowTo: Non-template class inheriting from an abstract specialized template

本文关键字:继承 抽象 专用 C++HowTo      更新时间:2023-10-16

我有一个非模板抽象基类,它是用来引用基类型的,因为非专用的模板类型不能用作方法参数。

#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 << "rnrn";
    }
    virtual void OnError(std::string error)
    {
        std::cout << "Error while executing a remote procedure: " << error << "rnrn";
    }
};
}
#endif // RPCPP_SAMPLE_CALLBACK_H

所有这些都编译得很好,但当我尝试使用它时,就像这样:

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

它会产生以下两个错误:

第1行中的"无法实例化抽象类"。第2行中的"无法将参数3从SampleCallback&转换为ICallbackBase&"

我做错了什么?

virtual void OnSuccess(void result) = 0;

从未定义。

您并没有实现所有抽象方法:

virtual void OnSuccess(void result)=0;

CalculateMaven的定义是什么?

以下是如何解决实际问题:

从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); }