Warum kein vector als Rückgabewert???
-
Guten Abend.
Ich wollte einen vector<string> als Rückgabewert benutzen, doch mein Kompiler spuckt immer ein paar Fehler aus:Syntaxfehler: Es fehlt ';' vor '<' Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. Unerwartete(s) Token vor ';'
Und hier der Code:
vector<string> GetVocabularyList(string filename);
Also ich kenne das aus C#, das man auch sowas zurückgeben kann. Kann man das bei C++ nicht oder habe ich einen Fehler bei der Definition gemacht?
Gruß Speedy_92
-
Hast du folgendes in deinem Code geschrieben?
#include <vector> using namespace std;
-
c# verwendet wie java immer pointer und managed das alles für dich
wenn du cpp programmierst musst du dir selbst überlegen wo und wann du pointer verwendest und das ist eben so ne situation
erstell in der methode einen
vector<string> *newVector = new vector<string>();
befüll ihn dann mit werten und gib eben diesen "vector<string> *" zurück, damit sollts gehen
-
Nexus schrieb:
Hast du folgendes in deinem Code geschrieben?
#include <vector> using namespace std;
Jup. Habe ich.
Und bei diesem Code:
void GetVocabularyList(string filename, vector<string> &voc_list);
zeigt er folgenden Fehler:
Syntaxfehler: Bezeichner 'vector'
-
Zusatzinformation, die vielleicht weiterhilft:
Der Code liegt in einer Headerdatei in einer Klasse.
Und wenn ich std:: eingebe, dann findet die Intellisense von VS auch vector, aber sobald ich die Klammern öffne (<) zeigt die Intellisense nichts mehr an.
-
Vevusio schrieb:
wenn du cpp programmierst musst du dir selbst überlegen wo und wann du pointer verwendest und das ist eben so ne situation
Nein, nicht zwangsweise, zumal hier eine ganz wichtige Problematik auftaucht:
Wer stellt den Speicher zur Verfügung, und wer räumt ihn auf.In dem Fall finde ich sogar trotz aller Performanceprobleme die Rückgabe per Wert besser als dein Ansatz. Hier ist wenigstens die Situation klar wie das mit dem Allozieren und Deallozieren abläuft - Bei Zeigern ist dies nicht der Fall. Die andere Alternative sind Smartpointer, speziell die mit Referenzzählung.
boost::shared_ptr<std::vector<std::string> > GetVocabularyList(std::string const & filename);
Oder als weitere Alternative: du übergibst den vector der zu füllen ist als Referenz. Was aber den Charakter der Rückgabe wiederspricht. In dem Fall würde ich persönlich als Rückgabewert ebenso eine Referenz auf eben diese Liste verwenden...
std::vector<std::string> & GetVocabularyList(std::string const & filename, std::vector<std::string> & vocabularyList) const { // vocabularyList modifizieren return vocabularyList; // und auch wenn dies doppelt-gemoppelt ist // zurückgeben um den aufruf an stellen verwenden zu können die mit // der Rückgabe arbeiten. }
Zudem solltest du dir vielleicht mal das anschauen.
cu André
P.S: "using namespace" niemals in Headern verwenden! Du benötigst auch ein "#include <vector>" und ein "#include <string>".
-
Vielen Dank, aber es taucht immer noch der Fehler auf:
'vector': Ist kein Element von 'std'
Und wenn ich das
using namespace std;
aus der Header-Datei entferne, dann tauchen auf einmal hunderte von Fehlern auf, dass er diesen Datentyp und jenen nicht kennt.
Ich habe eine stdafx.h, wo alle includes (auch vector und string) sind und der using namespace std; ist auch enthalten. Diese ist auch in die andere Header-Datei gebunden, aber trotzdem werden die ganzen Fehler angezeigt.
-
#include <vector>
Und zum 2. Dann fehlt da überall das std:: davor. In der .cpp kannst du using aber getrost nutzen, wovon ich allerdings abraten würde, wenn du nicht einen guten Grund hast. (Sprich es einen enormen Mehraufwand produzieren würde).
-
Speedy_92 schrieb:
Ich habe eine stdafx.h, wo alle includes (auch vector und string) sind und der using namespace std; ist auch enthalten. Diese ist auch in die andere Header-Datei gebunden, aber trotzdem werden die ganzen Fehler angezeigt.
Grundsätzlich: NIEMALS "using namespace" in einen Header setzen, die Nachteile überwiegen alle Vorteile (Sprich: auch nicht in die stdafx.h wenn man diese verwendet).
Folgendes Programm meldet keine Fehler (Nein, ich verwende grundsätzlich keine stdafx.h):
// Test.h #include <vector> #include <string> std::vector<std::string>& GetVocabularyList( std::string const & fileName, std::vector<std::string>& vocabularyList);
// Test.cpp #include "test.h" std::vector<std::string>& GetVocabularyList( std::string const & fileName, std::vector<std::string>& vocabularyList) { // Durch richtige Behandlung ersetzen... vocabularyList.push_back(fileName); return vocabularyList; }
// main.cpp #include <vector> #include <string> #include "test.h" int main() { std::vector<std::string> vocabularyList; GetVocabularyList("Test.voc", vocabularyList); return 0; }
cu André
-
Speedy_92 schrieb:
...Kann man das bei C++ nicht ...
Doch.
Speedy_92 schrieb:
...habe ich einen Fehler bei der Definition gemacht?...
Vermutlich.
Kann ich anhand der Codezeile nicht sehen - die ist jedenfalls korrekt.Vevusio schrieb:
...
erstell in der methode einenvector<string> *newVector = new vector<string>();
befüll ihn dann mit werten und gib eben diesen "vector<string> *" zurück, damit sollts gehen
Sorry, aber das hat mit der Problematik nichts zu tun und ich halte es auch für nicht geschickt, das hier zu tun (als Default-Ansatz).
Gruß,
Simon2.