Probleme mit Template
-
hmm, das is alles was ich momentan in der datei stehn hab, der rest ist auskommentiert. Kann natürlich sein, das in der datei wos eingebunden wird was nich passt ... mal gucken
ich weis allerdings nich wirklich, wie ich das weiter einschränken soll
hier mal der header der das verwendet:
#ifndef ROBOTWORLD_H #define ROBOTWORLD_H // RakNet Includes #include "RakNetTypes.h" #include "../Robot/Robot.h" #include <vector> //using namespace std; #include "../RobotCommon/RobotGameState.h" #include "RobotList.h" class RobotArena; class RobotViewer; class RobotViewpoint; class RobotComponent; class Robot; class RobotWorld : public RobotList<Robot*> { public: RobotWorld(); ~RobotWorld(); RobotArena* arena; ///< Zeiger zum Spielfeldobjekt RobotViewer* robotViewer; ///< Zeiger zur Viewerklasse bool addRobot(Robot* robot); ///< einen Robot hinzufuegen bool removeRobot(Robot* robot); ///< einen Robot entfernen bool removeRobot(SystemAddress systemAddress); ///< einen Robot entfernen bool addArena(const char* filename); ///< Eine Arena/Spielfeld laden GameState gameState; ///< In welcher Phase des Spiels befinden wir uns GameState getGameState(); virtual void changeGameState(GameState g); ///< die Spielphase wechseln void addViewpoint(RobotViewpoint* vp); ///< wird von RobotObject aufgerufen und gibt einen neuen Viewpoint an RobotViewer std::vector<RobotComponent*> components; void addComponent(RobotComponent* c); virtual void update(); }; #endifder wiederum von diesem eingebunden wird:
// generated by Fast Light User Interface Designer (fluid) version 1.0107 #ifndef main_h #define main_h #include <FL/Fl.H> #include "../RobotServer/RobotServer.h" #include "../RobotServer/RobotServerReplicator.h" #include "RobotWorld.h" #include "../RobotPhysic/RobotPhysic.h" #include "../RobotGame/RobotGame.h" #include "../RobotManager/RobotManager.h" extern RobotWorld robotWorld; void update(void*); #include <FL/Fl_Window.H> extern Fl_Window *robotServerWindow; extern RobotServer *robotServer; extern RobotServerReplicator *robotServerReplicator; extern Fl_Window *robotMainWindow; #include "RobotMainComponent.h" extern RobotMainComponent *robotMainComponent; #include <FL/Fl_Light_Button.H> extern Fl_Light_Button *btnShowViewer; extern Fl_Light_Button *btnShowServer; extern Fl_Window *robotViewerWindow; #include "../RobotViewer/RobotViewer.h" extern RobotViewer *robotViewer; #endifwas von der datei hier eingebunden wird:
// generated by Fast Light User Interface Designer (fluid) version 1.0107 #include "main.h" RobotWorld robotWorld; void update(void*) { robotWorld.update(); Fl::repeat_timeout(0.02, update); } Fl_Window *robotServerWindow=(Fl_Window *)0; static void cb_robotServerWindow(Fl_Window*, void*) { btnShowServer->clear(); robotServerWindow->hide(); } RobotServer *robotServer=(RobotServer *)0; RobotServerReplicator *robotServerReplicator=(RobotServerReplicator *)0; Fl_Window *robotMainWindow=(Fl_Window *)0; RobotMainComponent *robotMainComponent=(RobotMainComponent *)0; #include <FL/Fl_Image.H> static unsigned char idata_logo[] ={ // ein Bild }; static Fl_RGB_Image image_logo(idata_logo, 210, 210, 4, 0); Fl_Light_Button *btnShowViewer=(Fl_Light_Button *)0; static void cb_btnShowViewer(Fl_Light_Button*, void*) { if (robotViewerWindow->visible()) { robotViewerWindow->hide(); btnShowViewer->clear(); } else { robotViewerWindow->show(); btnShowViewer->set(); }; } Fl_Light_Button *btnShowServer=(Fl_Light_Button *)0; static void cb_btnShowServer(Fl_Light_Button*, void*) { if (robotServerWindow->visible()) { robotServerWindow->hide(); btnShowServer->clear(); } else { robotServerWindow->show(); btnShowServer->set(); }; } static void cb_Servers(Fl_Light_Button*, void*) { if (robotServer->btnOnline->value()==1) robotServer->btnOnline->clear(); else robotServer->btnOnline->set(); if (robotServerReplicator->btnOnline->value()==1) robotServerReplicator->btnOnline->clear(); else robotServerReplicator->btnOnline->set(); robotServer->onOnlineToggle(); robotServerReplicator->onOnlineToggle(); } Fl_Window *robotViewerWindow=(Fl_Window *)0; static void cb_robotViewerWindow(Fl_Window*, void*) { btnShowViewer->clear(); robotViewerWindow->hide(); } RobotViewer *robotViewer=(RobotViewer *)0; int main(int argc, char **argv) { Fl_Window* w; { Fl_Window* o = robotServerWindow = new Fl_Window(435, 620, "RobotServer"); w = o; o->callback((Fl_Callback*)cb_robotServerWindow); { RobotServer* o = robotServer = new RobotServer(0, 0, 435, 310); o->box(FL_THIN_DOWN_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(FL_ALIGN_CENTER); o->when(FL_WHEN_RELEASE); } { RobotServerReplicator* o = robotServerReplicator = new RobotServerReplicator(0, 310, 435, 310); o->box(FL_THIN_DOWN_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(FL_ALIGN_CENTER); o->when(FL_WHEN_RELEASE); } o->end(); } { Fl_Window* o = robotMainWindow = new Fl_Window(210, 330, "Robots"); w = o; { RobotMainComponent* o = robotMainComponent = new RobotMainComponent(0, 120, 210, 210); o->box(FL_DOWN_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->image(image_logo); o->deimage(image_logo); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(FL_ALIGN_CENTER); o->when(FL_WHEN_RELEASE); } { Fl_Light_Button* o = btnShowViewer = new Fl_Light_Button(5, 40, 200, 35, "Show RobotViewer"); o->callback((Fl_Callback*)cb_btnShowViewer); } { Fl_Light_Button* o = btnShowServer = new Fl_Light_Button(5, 5, 200, 30, "Show RobotServer"); o->callback((Fl_Callback*)cb_btnShowServer); } { Fl_Light_Button* o = new Fl_Light_Button(5, 80, 200, 35, "Servers I/O"); o->callback((Fl_Callback*)cb_Servers); } o->end(); o->resizable(o); } { Fl_Window* o = robotViewerWindow = new Fl_Window(650, 715, "RobotViewer"); w = o; o->callback((Fl_Callback*)cb_robotViewerWindow); { RobotViewer* o = robotViewer = new RobotViewer(0, 0, 650, 715); o->box(FL_THIN_DOWN_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(FL_ALIGN_CENTER); o->when(FL_WHEN_RELEASE); } o->end(); } robotWorld.addComponent(robotServer); robotWorld.addComponent(robotServerReplicator); robotWorld.addComponent(new RobotPhysic); robotWorld.addComponent(new RobotManager); robotWorld.addComponent(new RobotGame); robotWorld.addComponent(robotMainComponent); robotViewer->setRobotMain(&robotWorld); robotViewer->mainIsWorking(true); robotWorld.robotViewer = robotViewer; Fl::add_timeout(1.0, update); /// \todo 2 use a custom main loop instead of the timer robotMainWindow->show(argc, argv); btnShowViewer->set(); Fl_Group *child; child=(Fl_Group*)robotMainComponent; for (int i=child->children()-1; i>=0; --i) { child->child(i)->position(child->child(i)->x()+child->x(),child->child(i)->y()+child->y()); } for (int j=robotServerWindow->children()-1; j>=0; --j) { child=(Fl_Group*)robotServerWindow->child(j); for (int i=child->children()-1; i>=0; --i) { child->child(i)->position(child->child(i)->x()+child->x(),child->child(i)->y()+child->y()); } } w->show(argc, argv); return Fl::run(); }hoffe ich hab potentiel willige helfer jetzt nich erschlagen mit dem code
-
Ich nehme mal an du hast irgendwo RobotList (ich denke es wird in der robotlist.h sein) als normale nicht-template Klasse bereits definiert/deklariert.
Deswegen bringt er dir diese Fehlermeldung.Du kannst das ganz einfach testen, wenn du statt deinem Minimalbeispiel von oben mal folgendes testest und das ohne Fehler kompiliert:
template< typename foo, typename foobar > class bar { };
-
wrt schrieb:
...
ich weis allerdings nich wirklich, wie ich das weiter einschränken soll
...
hoffe ich hab potentiel willige helfer jetzt nich erschlagen mit dem codeHi,
naja, eigentlich wäre es hilfreich gewesen, die RobotList.h anzuzeigen.

ich rate mal ins Blaue rein: Du weißt, dass die komplette Implementation des Klassentemplates zur Compilezeit (auch jedes nutzenden Codes !!) sichtbar sein muß (das kaum unterstützte "export" mal ausgenommen) ?
Also üblicherweise: "Alles in den Header" ....Gruß,
Simon2.
-
naja, der code da oben ist alles, was ich in RobotList.h stehen hab ... der rest ist auskommentiert
was ich mir jetzt grade vorstellen kann ist das ich irgendwo nen
class RobotList;haben könnte, aber is eigentlich eher unwahrscheinlich, würde das probleme verursachen?
-
Na da passt dein Programm aber nicht wirklich zusammen - RobotList erwartet zwei Template-Parameter, du verwendest es aber mit nur einem Parameter.
(und ja, wenn du die Klasse einmal als Template und einmal als Nicht-Template deklarierst, bekommst du Probleme)
-
wrt schrieb:
naja, der code da oben ist alles, was ich in RobotList.h stehen hab ... der rest ist auskommentiert
was ich mir jetzt grade vorstellen kann ist das ich irgendwo nen
class RobotList;haben könnte, aber is eigentlich eher unwahrscheinlich, würde das probleme verursachen?
Ja.
Gruß,
Simon2.
-
Danke für die Denkanstöße, hatte wirklich noch nen
class RobotList; // und nen RobotList* robotList;in nem anderen Header.
also Danke nochmal
cu wrt
-
Gern geschehen.
Kommst Du denn jetzt weiter ?
Gruß,
Simon2.
-
scons: done building targets.sieht gut aus

der unittest meint
done.und das Spiel läuft auch, also danke nochmal

-
