C ++成员在非模板类中使用模板

时间:2014-07-15 07:32:39

标签: c++ visual-studio templates

Visual Studio中的干净重建使整个过程发挥作用。

-

在Visual Studio MFC项目中,我正在创建一个类来管理按钮。

这是我的问题:我需要在运行时添加Click Handler,这样我才能使用Message Map。所以我在我的类中有一个clickHandler函数指针,用于注册click处理程序。这对全局函数来说没问题,但我想使用类成员作为ClickHandlers。

经过大量搜索,我找到了这个功能:

class NRButton : public CButton
{
    ...
    template<class Type>
    inline void SetClickHandler(
        void (*cb)(CObject * , void (CObject::*)()),
        Type * pt,
        void (Type::*fn)()
    )
    {
        callbackHandler = cb;
        objectHandler   = pt;
        clickHandler    = fn;
    }
    ...
 }

如您所见,此函数是内联实现的,但是当我构建项目时,我发现了此链接器错误:

 FenetreParametrage.obj : error LNK2019: symbole externe non résolu "public: void __thiscall NRButton::SetClickHandler<class FenetreParametrage>(void (__cdecl*)(class CObject *,void (__thiscall CObject::*)(void)),class FenetreParametrage *,void (__thiscall FenetreParametrage::*)(void))" (??$SetClickHandler@VFenetreParametrage@@@NRButton@@QAEXP6AXPAVCObject@@P81@AEXXZ@ZPAVFenetreParametrage@@P82@AEXXZ@Z) référencé dans la fonction "public: virtual int __thiscall FenetreParametrage::OnInitDialog(void)" (?OnInitDialog@FenetreParametrage@@UAEHXZ)

清除错误信息后,我得到了:

 FenetreParametrage.obj : error LNK2019: symbole externe non résolu "
   public: void __thiscall NRButton::SetClickHandler<class FenetreParametrage>(
     void (__cdecl*)(class CObject *,void (__thiscall CObject::*)(void)),
     class FenetreParametrage *,
     void (__thiscall FenetreParametrage::*)(void)
   )
 "
 référencé dans la fonction "
   public: virtual int __thiscall FenetreParametrage::OnInitDialog(void)
 "

我理解这条错误消息,但我不明白它出现的原因,我的函数是内联声明的,那么为什么VS Compiler无法找到它的实现呢?

感谢您的帮助


编辑:

这是对函数的调用:

bouton->SetClickHandler(
    &FenetreParametrage::Callback,
    this,
    &FenetreParametrage::OnBoutonClick
);

0 个答案:

没有答案