从派生类调用父类的模板函数
Calling Template-Function of Parent-Class from Derived Class
我有一个非常具体的问题(不介意问我为什么要这个,解释起来会很复杂)
我想从父类调用一个模板函数,它间接调用子类的析构函数
我试着实现这个代码:
父类:
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);
};
相关文章:
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 两个父类的构造函数的序列
- C++调用使用重写函数的父类函数
- 在父类中公开受保护的构造函数
- 从父类的向量访问子类函数,而无需向下转换
- 将派生类的构造函数声明为父类的友元
- 如何从子类的构造函数初始化父类的私有成员
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 在父类函数中创建子类 - 可能吗?
- 调用父类函数来比较父类和子类
- 从多重继承中的派生类函数调用适当的父类函数
- 是否有 lint 工具可以检查子类虚拟函数是否与父类定义匹配?
- 无法使父类的虚拟函数正常工作
- 重写子类构造函数中的父类变量
- 构造函数将父类作为参数
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 如果不手动完成,子类是否继承父类的析构函数?
- 当函数返回类型为父类时,如何返回子类的对象?
- 将子类的成员函数强制转换为父类
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用