Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从派生类调用父类的模板函数_C++_Templates_Inheritance_Crtp - Fatal编程技术网

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

C++ 从派生类调用父类的模板函数,c++,templates,inheritance,crtp,C++,Templates,Inheritance,Crtp,我有一个非常具体的问题(不介意问我为什么想要这个,解释起来会很复杂) 我想从父类调用一个模板函数,它间接调用子类的析构函数 我尝试实现以下代码: 父类: template <typename BaseType> //OpcUa_NodeInstance.h class OpcUa_NodeInstance { public: template <typename BaseTypee, unsigned PrefixID> static vo

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

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

我尝试实现以下代码:

父类:

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);
}
template//OpcUa\u NodeInstance.h
类OpcUa_NodeInstance
{
公众:
模板
静态void deleteType(无符号整数对象);
};
模板//OpcUa\u NodeInstance.cpp
模板
void OpcUa_NodeInstance::deleteType(无符号对象)
{
if(ObjID==PrefixID)
{
NodeManager根*pNodeManagerRoot=NodeManager根::CreateRootNodeManager();
auto dummyTypeInstance=新的BaseType(UaNodeId(PrefixID,2),
UaString(“Dummy_AutomationDomainType”),2,pNodeManagerRoot;
删除dummyTypeInstance;
}
}
子类:

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);
}
class AutomationDomainTypeBase://AutomationDomainTypeBase.h
公共OpcUa_NodeInstance
{
公众:
模板
静态void deleteType(无符号整数对象);
}
问题是visual studio显示链接器错误

Error   5   error LNK2001: unresolved external symbol "public: static void __cdecl AutomationDomainTypeBase::deleteType<class AutomationDomainTypeBase,1018>(unsigned int)"
Error 5 Error LNK2001:未解析的外部符号“public:static void\uu cdecl AutomationDomainTypeBase::deleteType(unsigned int)”
AutomationDomainTypeBase


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

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

如果我使用这两种定义编译代码,则不会出现编译错误。

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

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

使用ms vc14,您提供的代码确实可以编译。@shrike谢谢,我忘了包含父级。h,我编辑了我的主题。你能帮我解决链接器错误吗?
template template@bipll如果我将类模板和函数模板命名为相同的话,我会得到这个错误:c3860Oh,当然,这两个是不同类型的变量。谢谢,我忘了包含父类。h,我编辑了我的主题。你能帮我解决链接器错误吗?@pepele:看到我答案中的最后一个“注意事项”,你就会得到答案;
OpcUa\u NodeInstance::deleteType()
的实现也必须在头文件中实现。但是我已经在头文件中实现了它,正如您在我的主题(第一段代码)的开头所看到的:-)问题是关于继承这种模板函数,我对crtp进行了研究,但没有找到答案。@pepele:crtp看起来是正确的;错误在于模板成员函数只在子类头中声明,没有定义/实现;如果可以使用通用实现,请在子类标头中添加此模板成员函数的实现(与父类模板成员函数的实现类似)。否则,您可能必须实现一些专门化。。。