C++ Benutzung von list<datatype>[Minimalbeispiel][geloest]

  • Themenstarter Themenstarter sw33tlull4by
  • Beginndatum Beginndatum
S

sw33tlull4by

Guest
Hi!
Ich schreibe zZ an einem Programm welches Listen verwaltet.
Der Datentyp der zu verwalten ist line.
line ist eine Klasse, welche einen Array, mit 27 eintraegen,vom Typ String, enthaelt und noch 2 zusaetzliche Strings, und es ueberlaedt den Ostream-Operator fuer die Klasse.
Dann habe ich eine Klasse,watchinglist.cpp, welche diese Liste verwaltet, und sortiert.
Wenn ich auf beide Klassen g++ -c <dateiname>.cpp ausfuehre , kompeliert alles problemlos.

Dann habe ich noch eine Klasse welche dieser Liste zuarbeitet.
Wenn ich nun auf diese Klasse g++ -c workingwithlist.cpp anwende bekomme ich eine Fehlermeldung welche in watchinglist.hpp angesiedelt ist, da wo vorher alles in ordnung war.
Alle includedatein sind in der richtigen Reihenfolge,string,iterator und list sind ebenfalls includiert.
namespace ist ueberall std.

Die Fehlermeldung:
ISO C++ forbids declaration of ?list? with no type
Der Code auf den sich das bezieht:
Code:
...
private: 		
			list<line> entries;//diese Zeile, 
			list<line>::iterator it;//als auch diese
...

Kann mir vielleicht einer sagen was ich da falsch geschrieben habe?
mfg

sw33t
 
Bei mir funktioniert es aber! *scnr

Mal ernsthaft, erwartest du ne antwort?
 
Du Scherzkeks!
Wenn ich keine Antwort erwarten wuerde wuerde ich nicht posten, das hier ist doch kein Affenzierkus :rolleyes: .

Es funktioniert, ja wenn ich nur watchinglist.cpp kompiliere,also weiss ich das was in deinem Post steht schon.
Was ich nicht verste ist wiso es nicht funktioniert wenn ich workingwithlist.cpp
kompiliere, in welches watchinglist.cpp eingebunden ist.
Wuesste ich das haette ich kein Problem.
mfg

sw33t
 
Es ist einfach so, dass du nicht gerade viele konkrete infos rausrückst. Stichwort: Minimalbeispiel
Der Fehler kann an vielem liegen.
Im übrigen sollte in Headern nie ein "using namespace" stehen, immer mit "std::list" arbeiten. Wenn du in deinem main dann ein "using namespace" hast, ist das zwar auch nicht schön, aber durchaus legitim ;)

Du übersetzt ja nur, es wird nicht geschaut, ob alles aufgelöst werden kann.
 
Original von lagalopex
Es ist einfach so, dass du nicht gerade viele konkrete infos rausrückst. Stichwort: Minimalbeispiel
Der Fehler kann an vielem liegen.
Im übrigen sollte in Headern nie ein "using namespace" stehen, immer mit "std::list" arbeiten. Wenn du in deinem main dann ein "using namespace" hast, ist das zwar auch nicht schön, aber durchaus legitim ;)

Du übersetzt ja nur, es wird nicht geschaut, ob alles aufgelöst werden kann.


sorry, das ich kurz offtopic gehe:
aber warum ists unschön "using namespace" nicht zu verwenden? (ich kanns mir denken, aber will nix falsches behaupten -> und wenns falsch is hoffe ich das es nun geklärt wird).

@sw33t: ich muss llagalopex recht geben, das is echt ein fieses Minimalbeispiel.

kumpel hat mich ma gefragt warum:
Code:
i = a+b;
cout << i << endl;
nicht funktioniert, mehr hat der mir nich über ICQ gegeben :D
(es lag daran, das er ne for schleife mit for(int i=0......){ code } gemacht hatte und wollte das für die forschleife definierte i weiterbenutzen....)

:D
 
Original von _fux_
sorry, das ich kurz offtopic gehe:
aber warum ists unschön "using namespace" nicht zu verwenden? (ich kanns mir denken, aber will nix falsches behaupten -> und wenns falsch is hoffe ich das es nun geklärt wird).

Angenommen, du hast einen Namespace Math, in dem gibt es eine Funktion "eval", die irgendetwas nicht weiter wichtiges tut. Falls du nun in einem Header
Code:
using namespace Math;
schreibst, kann keiner mehr, der deinen Header inkludiert, eine Funktion namens "eval" (die womöglich etwas völlig anderes machen soll als die ursprüngliche "eval"-Funktion) definieren.
Es kann aber noch schlimmer kommen: Falls jemand z.B. keine Lust mehr auf eine bestimmte z.B. Grafiklibrary hat, tauscht er diese gegen eine andere aus. Falls nun aber in der neuen so ein Header mit "using namespace ..." vorhanden ist, kann es zu allerlei Namenskollisionen mit Funktionen kommen, die bereits im Code vorhanden sind, und da der Entwickler keinen Einfluss auf die externe Library hat, darf er alle Funktionsnamen ändern, die kollidiert sind :)

Kurz gesagt: Dies zu tun, widerspricht dem Grund, weshalb namespaces überhaupt eingeführt wurden, nämlich damit solche Namenskollisionen nicht mehr so leicht vorkommen können.
 
sowas in der art hatte ich mir auch gedacht, war mir aber nie sicher.
in der FH haben wir paar strolche die sagen:
"ich benutz kein namespace weil es die anderen (vom höheren semester, in büchern...) auch nicht tun".
aber das ist ja wohl ein dummer grund wenn man den hintergrund nich kennt :D
sry fürs entführen und danke nochmal.
mist und ich dachte anfangs das man die dinger benutzt damit man nich mehr soviel tippen braucht ;) *lol*
 
Minimalbeispiel

Hi!
Erstmal danke fuer den Versuch mir zu helfen.
Das mit dem Minimalbeispiel versteh ich und seh ich auch total ein.
Ist halt so ein splin von mir das ich halt ungern nicht fertigen Quellcode veroeffentliche.
Komme aber nicht selbst darauf.
Ich habe also mal einfach alle Methoden geloescht, versucht es zu kompelieren und der Fehler besteht immer noch.
Also:
g++ -c working.cpp kompiliert und ich kriege ein Objektfile.
g++ -c filereadingfind.cpp kompiliert nicht und ich bekomme die oben genannten Fehlermeldungen.

mfg

sw33t


P.s.: leider hatte ich mehr als 5 Datein und *.tar ist eine unerlaubte Endung.
 
An sich hast du nur mit deinen includes mist gebaut.
Einfache Regel, alle includes in die Header Datei, die zur Klasse gehörende cpp Datei binden dann nur diese eine Header Datei ein.
 
Ich hab einen schreikrampf gekriegt als ich das gelesen habe.
Kann ich lange nach einem Fehler in meinem Code suchen.
Deine aenderungen funktionieren.
Was genau ist denn da passiert das es nicht lief?
Vielen dank.
mfg

sw33t
 
Es war einfach so, dass er nicht wusste was line ist, weil der header fehlte. Bzw er wurde in der cpp Datei eingebunden (daher konnte sie gebaut werden) aber andere, die diese Klasse nutzen wollen, wussten nichts von line, bzw mussten es selber einbinden (was natürlich nicht geschehen ist)
 
Zurück
Oben