Vector mit komplexen Datentypen unter Linux
-
Hallo,
ich habe schon unzählige male das Template "vector" benutzt um komplexe Datentypen zu speichern, irgendwie klappts nicht in Linux.
... #include <vector> ... using namespace std; ... int main(){ class Pos { public: double x; double y; Pos (double _x, double _y){ x = _x; y = _y; } }; ... vector<Pos> v; ... return 0; }Der Compiler meckert jetzt immer:
template argument 1 invalid
template argument 2 invalid
invalid type in declaration before ';' tokenWeiß jemand Rat woran das liegen könnte?
Ist der Compiler zu doof oder zu alt?
Verwende den gnu g++ 4.4.3 unter Ubuntu10.
Das ganze läuft auf einer virtuellen Maschine. (Virtual Box)Danke

-
Nein der Compiler ist zu neu, dein Code ist zu doof und zu alt
. Wobei ich mir eigentlich nicht vorstellen kann, dass den jemals irgendein Compiler so geschluckt hat. Das Problem hier ist, lokale Klassen sind keine gültigen Templateparameter. Was mich gerade wundert, dass du nur so eine kurze Fehlermeldung bekommst, mein g++ 4.4.4 sagt nämlich ziemlich eindeutig:error: template argument for ‘template<class _Tp> class std::allocator’ uses local type ‘main()::Pos’ error: trying to instantiate ‘template<class _Tp> class std::allocator’edit: Und außerdem fehlt, so wie du das hier schreibst, vor
vectornoch einstd::.edit2: Von der Art wie die Klasse Pos aufgebaut ist, nehme ich mal an, dass die Lokalität hier wohl ein Versehen ist, richtig?
-
Das std:: fehlt nicht, da oben "using namespace std"!
Die Klasse Pos hab ich mir aus dem Finger gesaugt, da ausreichend. Hätte erst den ganzen Code aus der VM kopieren müssen. Lokalitäten sind aus Faulheit entstanden

Habe den gesamten Code in MVS2010 gecoded, da mir die VM zu lahm war. Jetzt habe ich das Problem, dass in der VM nichts mehr funktioniert.

Der Compiler von Visual Studio 2010 hat sowas geschluckt. Und da war die Klasse Pos nur ein Struct.
Der Tipp, dass eine Templateklasse nicht lokal sein darf ist schon mal ganz gut.Ich guck mal wie weit ich damit jetzt komme. Danke!
-
anjohn schrieb:
Die Klasse Pos hab ich mir aus dem Finger gesaugt, da ausreichend. Hätte erst den ganzen Code aus der VM kopieren müssen. Lokalitäten sind aus Faulheit entstanden

So kann man dir aber nicht helfen. Du musst 1:1 den Code zeigen der den Fehler produziert. Sonst baust du, wie hier, andere Fehler ein und das hilft niemanden.
-
Nee, ich hab keine anderen Fehler eingebaut. Ich hab mein Problem einfach auf das wesentliche reduziert.
Eigentlich wollte ich euch so Arbeit ersparen, tut mir Leid wenn es nicht so war.
Jedenfalls lag es wirklich an der lokalen Klasse und alle weiteren 300 Fehlermeldungen waren darauf zu beziehen. Ich weiß nicht, wann ich darauf gekommen wäre, dass es an der lokalen Klassendeklaration liegt. Man baut halt schnell gerne irgendwo kurz ein Struct Pos {double x; double y;}; ein und im Microsoft Visual Studio 2010 hat es wie gesagt wunderbar funktioniert!
Danke

"Compiler zu neu, Code zu doof" trifft es irgendwo im Kern :p
-
In C++-11 darf man auch lokale structs in Templates verwenden. Mit dem g++ 4.5 geht es, wenn man -std=c++0x als Option mitgibt.
-
manni66 schrieb:
In C++-11 darf man auch lokale structs in Templates verwenden. Mit dem g++ 4.5 geht es, wenn man -std=c++0x als Option mitgibt.
Cool, für die Zukunft gut zu wissen! Solch eine Tatsache hatte ich auch erwartet...