Вызов функции-шаблона родительского класса из производного класса
У меня очень специфический вопрос (не против спросить, почему я этого хочу, было бы очень сложно объяснить это)
Я хочу вызвать Template-Function из родительского класса, который косвенно вызывает деструктор дочернего класса
Я пытался реализовать этот код:
Родительский класс:
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);
}
проблема в том, что visual studio показывает ошибку компоновщика
Error 5 error LNK2001: unresolved external symbol "public: static void __cdecl AutomationDomainTypeBase::deleteType<class AutomationDomainTypeBase,1018>(unsigned int)"
AutomationDomainTypeBase
Я предполагаю, что Компилятор не может распознать, что Реализация deleteType уже находится в Родительском Классе. Из-за наличия более 400 дочерних классов я ищу способ не реализовывать эту функцию у всех детей.
1 ответ
Вы пытаетесь определить дочерний класс, не включая первое определение родительского класса.
Если я скомпилирую ваш код с обоими определениями, я не получу ошибку компиляции.
Но если я скомпилирую только определение дочернего класса, не включая сначала определение родительского класса, я получу:
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 '<'
прямо как ты.
Примечание: убедитесь, что OpcUa_NodeInstance<BaseType>::deleteType()
Функция-член шаблона правильно определена (и не только объявлена) в заголовочном файле, где вы определяете OpcUa_NodeInstance
шаблон класса. В противном случае вы получите неопределенный символ при связывании.
Новое редактирование:
ОК, я думаю, что я получил то, что вам нужно: просто не объявлять / определять AutomationDomainTypeBase::deleteType()
если ты хочешь только OpcUa_NodeInstance::deleteType()
использоваться для любого дочернего класса.
Кроме того, я думаю, что вы можете просто определить OpcUa_NodeInstance::deleteType()
следующее:
template <typename BaseType>
class OpcUa_NodeInstance
{
public:
template <unsigned PrefixID>
static void deleteType(unsigned int ObjID);
};