Unklar warum Templateklasse undefiniert
-
Hallo,
ich habe ein größeres Projekt, das unter anderem die Dateien "sim_nc.h"
#ifndef SIM_NODE_CONTNR_H_ #define SIM_NODE_CONTNR_H_ #include "standard.h" #include "base_nc.h" using namespace std; class Sim_Nd; class Sim_NC; class Sim_Intern_NC; class Sim_Tree; class Sim_NC : public virtual Base_NC<Sim_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree> { ... }; ...und "base_nc.h"
#ifndef BASE_NODE_CONTR_H #define BASE_NODE_CONTR_H #include "standard.h" #include "changes.h" #include "dot.h" #include "error.h" #include "in_out.h" #include "trans_probs.h" #include "tree.h" using namespace std; struct struct_dot_para; class Tree; class Changes; class S_and_P; template<class N, class C, class PC, class T> class Base_NC { ... }; ...enthält.
Wenn ich versuche zu kompilieren, erhalte ich die Fehlermeldung
../src/node/sim_nc.h:17: error: expected template-name before ‘<’ token
../src/node/sim_nc.h:17: error: expected `{' before ‘<’ token
../src/node/sim_nc.h:17: error: expected unqualified-id before ‘<’ tokenbzgl. der Zeile
class Sim_NC : public virtual Base_NC<Sim_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree>Wenn ich in "sim_nc.h" noch
template<class N, class C, class PC, class T> class Base_NC;hinzufüge, ändert sich die Fehlermeldung zu
../src/node/sim_nc.h:17: error: invalid use of undefined type ‘struct Base_NC<Sim_Nd, Sim_NC, Sim_Intern_NC, Sim_Tree>’
Kann jemand eine Vermutung anstelle, was hier passiert?
-
Hi, in der "base_nc.h" fehlt ein Semikolon zum Klassenabschluß oder hast Du es nur nicht mitkopiert?
-
witte schrieb:
Hi, in der "base_nc.h" fehlt ein Semikolon zum Klassenabschluß oder hast Du es nur nicht mitkopiert?
Sorry, nur vergessen mitzukopieren, habe ich im Code korrigiert.
-
Sind evtl. zirkuläre Abhängigkeiten beim Inkludieren entstanden?
-
camper schrieb:
Sind evtl. zirkuläre Abhängigkeiten beim Inkludieren entstanden?
Gibt es eine Möglichkeit das rauszufinden außer per Hand den Code durchzugehen?
-
ingobulla schrieb:
Gibt es eine Möglichkeit das rauszufinden außer per Hand den Code durchzugehen?
Include-Guards.
-
Nexus schrieb:
ingobulla schrieb:
Gibt es eine Möglichkeit das rauszufinden außer per Hand den Code durchzugehen?
Include-Guards.
Wie sollen Include-Guards dabei helfen, zyklische Includedirektiven zu finden?
-
ingobulla schrieb:
camper schrieb:
Sind evtl. zirkuläre Abhängigkeiten beim Inkludieren entstanden?
Gibt es eine Möglichkeit das rauszufinden außer per Hand den Code durchzugehen?
Gibt es keine Programme, die einem graphisch (oder auf andere Weise übersichtlich) aufbereiten, welche Dateien von jeder Datei inkludiert werden?
Oder kann man sich irgendwie anschauen, was der Präprozessor aus dem Code macht?
-
doxygen kann, im Zusammenhang mit graphviz, die include-Abhängigkeiten grafisch darstellen.
-
Mit entsprechenden Optionen (z.B. gcc: -E visual c++: /E) kannst du den Compiler anweisen, den Output des Präprozessors auszugeben. Falls eine zirkuläre Abhängigkeit Ursache des Problems darstellt, würde sich das dadurch äußern, dass die Definition Base_NC erst nach der Definition von Sim_NC erfolgt.
-
MFK schrieb:
Wie sollen Include-Guards dabei helfen, zyklische Includedirektiven zu finden?
Man kann damit verhindern, dass Header mehrfach eingebunden und eventuell auch eine Warnung/einen Fehler ausgeben.
Oh, irgendwie hab ich das Gefühl, ich hab unter zirkulären Abhängigkeiten etwas anderes verstanden. Falls dem so ist, sorry für meinen Beitrag.
