我试图重写一个在另一个项目的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>c:usersdominikdocumentsvisual studio 2013projectsprofileprofileprofile.cpp(25):错误C2259: 'Receiver':无法实例化抽象类
1>由于下列成员HumanInteraction::IInputReceiver::onInput(const T &)':是抽象的
profile.cpp(25)行尝试初始化Receiver的实例,如下所示——这里没有什么特别的:
Receiver receiver;
当然,编译器认为在纯虚函数中基类中的onInput是正确的,但是,我在派生类中重写了这个函数。因此,Receiver类并不像日志显示的那样抽象。
虽然我通常倾向于自己解决问题,但这次我完全不知道为什么会发生这个错误-绝对无效。
我将非常感谢任何对这个问题的贡献,即使它是'only'注释。
基类中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;