Syntaxfehler bei <vector>



  • Hallöchen,

    ich habe hier nur ein kleines Problem, dass mich aber ein klein wenig nervt, da ich ohne gerade nicht weitermachen kann:

    Ich habe eine Header-Datei angefertigt:

    #include <vector>
    
    class Test
    {
    private:
    
    	vector<int> t;
    
    public:
    
    	Test();
    };
    

    Nun, wenn ich es kompiliere/debugge, kommen dauernd die Fehler:
    Fehler 1 error C2143: Syntaxfehler: Es fehlt ';' vor '<'
    Fehler 3 error C2238: Unerwartete(s) Token vor ';'
    Fehler 2 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    Seltsam ist nur, wenn ich die Klasse nicht verwende, und in einer int main() Methode Vektoren einbine mittels <vector> und dann auch Vektoren erstelle wie eben im obigen Code, dann läuft das ohne Probleme.
    Habe ich etwas übersehen?


  • Mod

    vector liegt im Namespace std.



  • Wie auch alles andere in der Standardbibliothek befindet sich vector im Namensraum std, es muss also std::vector lauten.
    Edit: zu langsam.



  • Etwas ergänzend zum gesagten...

    ProjectMayhem schrieb:

    Seltsam ist nur, wenn ich die Klasse nicht verwende, und in einer int main() Methode Vektoren einbine mittels <vector> und dann auch Vektoren erstelle wie eben im obigen Code, dann läuft das ohne Probleme.
    Habe ich etwas übersehen?

    In deiner main.cpp verwendest du mit Sicherheit die Zeile "using namespace std;", womit du den Namensraum std ausschüttest (mit allen damit verbundenen Vor- und Nachteilen). Im wesentlichen bedeutet das, das ein std::vector als vector angesprochen werden kann, aber auch eine höhere Gefahr eines Namenskonfliktes.

    Grundsätzlich sollte man "using namespace" mit Vorsicht geniesen, und niemals im Header (oder allgemeiner gesprochen: Niemals in Dateien die includiert werden) verwenden, und auch erst hinter allen Includes. Sonst gibt man einen Namensraum unter Umständen global frei. Und letzteres erschwert ungemein die Fehlersuche falls doch einmal ein Namenskonflikt auftritt...



  • Oh Gott! Können wir bitte diesen Thread hier löschen, damit niemand weiteres diese Peinlichkeit meinerseits erfaährt? Das soll eine Sache zwischen uns vieren bleiben 😃

    Gerade ein anderes Projekt geöffnet und dort habe ich "using namespace std;" verwendet, hmpf!

    @asc

    Könntest du mir bitte "Namenskonflikt" im Bezug auf "using namespace std" präzisieren?



  • Nutzt eine Mathebibliothek ebenfalls einen vector und in irgendeiner Übersetzungseinheit verwendest Du beide Header, die fälschlicherweise using namespace std; nutzen, so ist ein nicht unbedingt einfach zu findender Namenskonflikt möglich.

    // Header1.h
    #include <vector>
    using namespace std;
    class SomeClass
    {
    private:
    vector<int> test;
    };
    
    // Header2.h
    #include <MathBib/vector.hpp>
    using namespace MathBib;
    class SomeOtherClass
    {
    private:
    vector<double> test2;
    };
    
    // SomeFile.cpp
    #include "Header1.h"
    #include "Header2.h"
    
    using namespace std; // hat keinen Effekt, die "using namespace"s wurden schon ausgeführt
    
    int main()
    {
    vector<SomeOtherClass> blub; // Compiler: Welchen vector bitteschön?
    // Benutzer, der nichts von den schlecht geschriebenen Headern weiß: ist doch wohl klar?!
    // ...
    return 0;
    }
    


  • Ah, verstehe! Danke für den Beispielcode 🙂


Anmelden zum Antworten