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 istno 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.