Вызов функции-шаблона родительского класса из производного класса

У меня очень специфический вопрос (не против спросить, почему я этого хочу, было бы очень сложно объяснить это)

Я хочу вызвать 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);
};
Другие вопросы по тегам