我试图覆盖已在另一个项目中的DLL内声明的抽象类,但是,当我尝试初始化重写类时,我收到编译错误。
这些是visual studio项目,因此,visual studio的内置编译器用于编译所有代码。
我在DLL中有一个模板类:
#ifndef __IINPUT_RECEIVER_H_
#define __IINPUT_RECEIVER_H_
#ifdef HUMANINTERACTION_EXPORTS
#define HUMANINTERACTION_API __declspec(dllexport)
#else
#define HUMANINTERACTION_API __declspec(dllimport)
#endif
namespace HumanInteraction
{
template<typename T>
class HUMANINTERACTION_API IInputReceiver
{
public:
virtual ~IInputReceiver()
{}
/**
* Called when new input is received
*/
virtual void onInput(const T& refInput) = 0;
};
}
#endif
在另一个使用这个DLL的项目中,我从这个类继承并覆盖它的方法,如下所示:
class Receiver : public IInputReceiver<wchar_t*>
{
public:
/**
* Called when new input is received
*/
virtual void onInput(const wchar_t*& refInput)
{
wstring str(refInput);
wcout << L"Received: " << str << endl;
}
};
但是当我尝试初始化Receiver类的实例时,我收到以下编译错误;我省略了不相关的日志:
1&gt; c:\ users \ dominik \ documents \ visual studio 2013 \ projects \ profile \ profile \ profile.cpp(25):错误C2259:'Receiver':无法实例化抽象类
1&GT;由于以下成员:1&gt; “无效 HumanInteraction :: IInputReceiver :: onInput(const T&amp;)':is abstract
line profile.cpp(25)尝试初始化Receiver的实例,就像这样 - 这里没什么特别的:
Receiver receiver;
当然编译器对于纯虚函数中基类的onInput是正确的,但是,我在派生类中重写了这个函数。因此,类Receiver不是日志所示的抽象。
虽然通常我倾向于自己解决我的问题,但我完全没有任何线索这一次为什么会出现这种错误 - 绝对无效。
我非常感谢对这个问题的任何贡献,即使它只是'仅'评论。
答案 0 :(得分:4)
基类中virtual
成员函数的签名是
virtual void onInput(const T& refInput) = 0;
派生类中的那个是
virtual void onInput(const wchar_t*& refInput)
您需要使用的是:
virtual void onInput(wchar_t* const& refInput)
如果你使用
会更有意义virtual void onInput(T const& refInput) = 0;
在基类中。