2015-09-11 22 views
1

我试图重写已在另一个项目中的一个DLL中声明的抽象类,但是,当我尝试初始化重写的类时,我收到编译错误。C++:编译错误覆盖函数从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:\用户\多米尼克\文件\的Visual Studio 2013 \项目\轮廓\轮廓\ profile.cpp(25):错误C2259: '接收器':不能实例化抽象类

1>由于下列成员:1> '无效 HumanInteraction :: IInputReceiver :: onInput(常量Ť&)':是抽象

线profile.cpp(25)试图初始化Receiver的一个实例,就像这样 - 没什么特别的:

Receiver receiver; 

当然编译器是正确的onInput在纯虚函数的基类中,但是,我在我的派生类中重写了这个函数。因此,类Receiver不像日志所示的那样是抽象的。

虽然通常我倾向于自己解决我的问题,但我现在完全没有线索,为什么这个错误发生 - 绝对无效。

我将非常感谢任何对此问题的贡献,即使它只是'评论'。

回答

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; 

在基类中。