warum lässt sich vector nicht einbinden?



  • HALL0.

    das ist meine header datei zu der klasse cCoo.

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    #pragma once
    
    class cCoo
    {
    public:
    	cCoo(void);
    	~cCoo(void);
    	void   SetCoo(int xyzv, double zahl);
    	double GetCoo(int xyzv);
    private:
    	double itsCoo[4];
    };
    
    typedef vector <cCoo>		MyLay;
    

    warum gibts dazu immer folgende fehlermeldungen?

    error C2872: 'vector' : ambiguous symbol
    error C2143: syntax error : missing ';' before '<'
    error C2059: syntax error : '<'

    danke schön.
    STICK.



  • Das liegt nicht an der Headerdatei allein, sondern entweder an der .cpp-Datei, die diese Headerdatei einbindet, oder einer anderen Headerdatei, die davor eingebunden wird.

    Du brauchst hier übrigens weder <algorithm> noch <iostream>. Und eine using-Direktive in einer Headerdatei ist auch keine so tolle Idee.



  • MFK schrieb:

    Und eine using-Direktive in einer Headerdatei ist auch keine so tolle Idee.

    könntest du mir bitte sagen warum dies so ist?

    wo kann man dann die vector-datei einfügen, so dass sie für alle dateien erreichbar ist. in die stdafx.h? weil das habe ich bereits probiert, scheint aber nicht zu funktionieren.



  • stick_thai schrieb:

    MFK schrieb:

    Und eine using-Direktive in einer Headerdatei ist auch keine so tolle Idee.

    könntest du mir bitte sagen warum dies so ist?

    wo kann man dann die vector-datei einfügen, so dass sie für alle dateien erreichbar ist. in die stdafx.h? weil das habe ich bereits probiert, scheint aber nicht zu funktionieren.

    Das macht man nicht, weil du damit für ALLE Anwender deiner Module/Klassen, die
    zu diesem Zweck deinen Header einbinden müssen, ERZWINGST das der namespace
    std "offengelegt" wird, auch wenn sie das vielleicht nicht wollen.

    Das verhindert man, indem man in Headern die vollen qualifizierten Namen verwendet.

    //using namespace std;
    ...
    typedef std::vector <cCoo> MyLay;
    


  • stick_thai schrieb:

    MFK schrieb:

    Und eine using-Direktive in einer Headerdatei ist auch keine so tolle Idee.

    könntest du mir bitte sagen warum dies so ist?

    Weil sich das nicht mehr rückgängig machen lässt. Jeder, der diese Headerdatei benutzt, muss sich damit abfinden, dass alle Bezeichner aus std in den globalen Namensraum gehoben werden. Durch das Hinzufügen dieser Headerdatei könnte ein Programm sein Verhalten komplett ändern.

    wo kann man dann die vector-datei einfügen, so dass sie für alle dateien erreichbar ist.

    Es geht nicht um die Includedirektive für <vector> in dieser Datei. Der Fehler steckt in einer anderen Datei. Habe ich doch schon gesagt.

    in die stdafx.h? weil das habe ich bereits probiert, scheint aber nicht zu funktionieren.

    "Scheint nicht zu funktionieren" ist keine ausreichende Fehlerbeschreibung.



  • @MFK:
    du hattest natürlich recht, es ging wirklich nicht um die includedirektive. ich habe in einer weiteren eingebundenen headerdatei (3dmath.h) feststellen müssen, dass es dort eine klasse vector gibt. ich denke, diese klasse macht den fehler aus.

    #include <iostream>
    #include <vector>
    
    class vector
    {
    public:
    	vector();
    	~vector();
    };
    
    int main()
    {
    	vector <int> i;
    
    	return 0;
    }
    

    gibt es dann in diesem fall eine möglichkeit, in main() festzulegen, dass der vector aus der headerdatei gemeint ist?

    DANKE.
    STICK.

    P.S.: mit umbenennen der klasse habe ich bereits probiert, aber wenn ich zum beispiel den klassennamen von vector auf Vector verändere, und ansonsten an dem gesamten code nichts, dann gibt es keine fehlermeldungen 😮



  • Hier hast du genau so einen Fall, bei dem dir die using-Direktive das Programm kaputtmacht. Lass sie einfach weg, und schreib überall dort, wo den vector aus der Standardbibliothek meinst, std::vector.



  • es funktioniert jetzt.
    vielen DANK für die neue lektion und die hilfe!



  • MFK schrieb:

    Hier hast du genau so einen Fall, bei dem dir die using-Direktive das Programm kaputtmacht. ...

    Können wir diesen Thread nicht in den FAQ verlinken ?
    Dieses "Kein using namespace std im Header" ist ja inzwischen auf dem besten Weg, dem "string statt char*" den Rang abzulaufen. 😉

    Und es ist ein super Beispiel, daß es sich dabei nicht um "akademisches Ästhetikgequatsche" handelt, sondern realen Programmierern (auch Anfängern) reale Probleme beschert.

    Gruß,

    Simon2.


Anmelden zum Antworten