2016-05-04 12 views
0

habe ich eine sehr spezielle Frage (nicht Sinn zu fragen, warum ich dies wollen, wäre es sehr schwierig sein, es zu erklären)Aufruf Template-Funktion der Eltern-Klasse von Abgeleitete Klasse

Ich möchte ein Template-Funktion aufrufen von einer Eltern-Klasse, die indirekt den Destructor der Kindes-Klasse ruft

ich diesen Code zu implementieren versucht:

die übergeordnete Klasse:

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; 
    } 
} 

Das Kind Klasse:

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

das Problem ist, dass Visual Studio

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

AutomationDomainTypeBase einen Linker Fehler

Ich vermute, der Compiler kann nicht erkennen, zeigt, dass die Implementation of deleteType ist bereits im Parent -Klasse. Da ich mehr als 400 Kind-Klassen habe, suche ich nach einer Möglichkeit, diese Funktion nicht in allen Kindern zu implementieren.

+0

Der Code, den Sie in Ordnung mit mir zur Verfügung gestellt hat kompilieren, ms VC14 verwendet wird. – shrike

+0

@shrike danke, ich habe vergessen, die Parent.h, ich habe mein Thema bearbeitet. Kannst du mir mit dem Linker Fehler helfen? – Pepelee

+0

'Vorlage Vorlage bipll

Antwort

1

Sie versuchen, die untergeordnete Klasse ohne die erste Definition der übergeordneten Klasse zu definieren.

Wenn ich Ihren Code mit beiden Definitionen kompiliere, habe ich keinen Kompilierungsfehler.

Aber wenn ich nur das Kind Klassendefinition kompilieren, ohne erste übergeordnete Klassendefinition einschließlich, ich habe:

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 '<' 

wie Sie.

Hinweis: Stellen Sie sicher, dass OpcUa_NodeInstance<BaseType>::deleteType() Template-Memberfunktion richtig definiert (und nicht nur deklariert) in der Header-Datei, wo Sie OpcUa_NodeInstance Template-Klasse definieren. Andernfalls erhalten Sie bei der Verknüpfung ein undefiniertes Symbol.


New edit:

OK, ich glaube, ich habe, was Sie brauchen: nur nicht ausdrücklich erklären/definieren AutomationDomainTypeBase::deleteType(), wenn Sie nur OpcUa_NodeInstance::deleteType() zu für jedes Kind Klasse verwendet werden.

Außerdem glaube ich, Sie einfach OpcUa_NodeInstance::deleteType() definieren können wie folgt:

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

Danke, ich habe vergessen, die Parent.h, ich habe mein Thema bearbeitet. Kannst du mir mit dem Linker Fehler helfen? – Pepelee

+0

@Pepelee: siehe die letzte "Note" in meiner Antwort, erhalten Sie die Antwort; Implementierung von 'OpcUa_NodeInstance :: deleteType()' muss auch in der Header-Datei implementiert werden. – shrike

+0

aber ich habe es bereits in der Header-Datei implementiert, wie Sie am Anfang meines Themas sehen können (erstes Snippet) – Pepelee