C++ Fragen zum GCC/G++



  • Hiho,

    ich habe hier ein paar Sachen die im Vs wunderbar kompilieren und meiner Meinung nach auch ISO-Konform sind, aber im GCC nichts. NUtzen tue ich GCC 4.3.3. unter Eclipse und Ubuntu.

    Nr 1:

    std::wifstream file(path.c_str());
    StringType line;
    
    while(std::getline(file,line)) //Compile-Fehler
    

    Der mag kein wstring bei getline. Die getline-Funktion ist aber nach Standard doch ein Template. Im VS funzt das wunderbar.

    Nr 2:

    class CStdGraph
    {
    	public:	
    		typedef std::vector<Vertex> VertexVec;
    ...
    
    //
    void CStdGraph::removeAll()
    {
    	m_vertices.swap(VertexVec());//Compile-Fehler
    

    Das ist ein normales Shrink-To-Fit. Mag der GCC auch nicht.

    Kann man da was machen? Woran liegt das? Der GCC ist dich eigentlich auch sehr iso-konform.



  • Mein GCC merkt nicht =o



  • 😡 Warum postest du nicht die Fehlermeldungen? 😡

    Bei 2. ist VertexVec() ein temporary! Da kannst du nicht hinswappen! Siehe Rvalue References in C++0x.



  • user53645 schrieb:

    Bei 2. ist VertexVec() ein temporary! Da kannst du nicht hinswappen!

    Aber raus seltsamerweise: VertexVec().swap(m_vertices)



  • user53645 schrieb:

    😡 Warum postest du nicht die Fehlermeldungen? 😡

    Bei 2. ist VertexVec() ein temporary! Da kannst du nicht hinswappen! Siehe Rvalue References in C++0x.

    Das ist legaler C++ Code würd ich sagen, steht auch so in meinem STL-Buch drinne und das ist kein M$-Buch.
    Fehlermeldung ist

    no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’

    Bashar schrieb:

    Aber raus seltsamerweise: VertexVec().swap(m_vertices)

    Jo das hab ich auch festgestellt.



  • Pellaeon schrieb:

    std::wifstream file(path.c_str());
    StringType line;
    
    while(std::getline(file,line)) //Compile-Fehler
    

    ist standardkonform, wenn deine Informationen stimmen, im übrigen kompiliert das hier wunderbar mit gcc 4.3.3 (Gentoo)

    #include <string>
    #include <fstream>
    
    int main()
    {
        std::string path;
        std::wifstream file(path.c_str());
        std::wstring line;
        while(std::getline(file,line)) {}
    }
    

    wie lautet denn die Fehlermeldung?

    Pellaeon schrieb:

    m_vertices.swap(VertexVec());//Compile-Fehler
    

    Ist nicht standardkonform, der Grund wurde bereits genannt. Im Übrigen ist bekannt, dass msvc++ seit Urzeiten eine entsprechende Compilererweiterung besitzt. Das ändert nichts daran, dass der Code nicht konform ist.

    VertexVec().swap(m_vertices)
    

    ist die offensichtliche Abhilfe hierzu.


Anmelden zum Antworten