从派生类调用父类的模板函数

Calling Template-Function of Parent-Class from Derived Class

本文关键字:函数 父类 派生 调用      更新时间:2023-10-16

我有一个非常具体的问题(不介意问我为什么要这个,解释起来会很复杂)

我想从父类调用一个模板函数,它间接调用子类的析构函数

我试着实现这个代码:

父类:

template <typename BaseType>         //OpcUa_NodeInstance.h
class OpcUa_NodeInstance
{
public:
    template <typename BaseTypee, unsigned PrefixID>
    static void deleteType(unsigned int ObjID);
};
template <typename BaseType> // OpcUa_NodeInstance.cpp
template <typename BaseTypee, unsigned PrefixID>
void OpcUa_NodeInstance<BaseType>::deleteType(unsigned ObjID)
{
    if (ObjID == PrefixID)
    {
        NodeManagerRoot* pNodeManagerRoot = NodeManagerRoot::CreateRootNodeManager();
        auto dummyTypeInstance = new BaseTypee(UaNodeId(PrefixID, 2),
            UaString("Dummy_AutomationDomainType"), 2, pNodeManagerRoot);
        delete dummyTypeInstance;
    }
}

子类:

class AutomationDomainTypeBase: // AutomationDomainTypeBase.h
    public OpcUa_NodeInstance<AutomationDomainTypeBase>
{
   public:
          template <typename BaseType, unsigned int PrefixID> 
          static void deleteType(unsigned int ObjID);
}

问题是visualstudio显示链接器错误

Error   5   error LNK2001: unresolved external symbol "public: static void __cdecl AutomationDomainTypeBase::deleteType<class AutomationDomainTypeBase,1018>(unsigned int)"

AutomationDomainTypeBase

我猜编译器无法识别deleteType的Implementation已经在父类中。由于有超过400个子类,我正在寻找一种不在所有子类中实现此功能的方法。

您试图在不包含父类的第一个定义的情况下定义子类

如果我用这两个定义编译你的代码,我没有编译错误

但如果我只编译子类定义,而不首先包括父类定义,我得到:

1>TimeTime_Test.cpp(625): error C2504: 'OpcUa_NodeInstance' : classe de base non définie
1>TimeTime_Test.cpp(625): error C2143: erreur de syntaxe : absence de ',' avant '<'

就像你一样

注意:确保在定义OpcUa_NodeInstance模板类的头文件中正确定义了OpcUa_NodeInstance<BaseType>::deleteType()模板成员函数(而不是仅声明)。否则,您将在链接时得到一个未定义的符号。


新编辑:

好吧,我想我已经得到了你需要的:如果你只想让OpcUa_NodeInstance::deleteType()用于任何子类,就不要声明/定义AutomationDomainTypeBase::deleteType()

此外,我认为您可以简单地定义OpcUa_NodeInstance::deleteType()如下:

template <typename BaseType>
class OpcUa_NodeInstance
{
public:
    template <unsigned PrefixID>
    static void deleteType(unsigned int ObjID);
};