2015-03-12 18 views
9

Ich versuche, einen Vektor von ofstreams zu erstellen ..Erstellen Sie einen Vektor von ofstreams

vector<ofstream> streams; 
for (int i = 0; i < numStreams; i++){ 
    ofstream out; 
    string fileName = "text" + to_string(i) + ".txt"; 
    output.open(fileName.c_str()); 
    streams.push_back(out); 
} 

Dieser Code kompiliert nicht .. speziell die letzte Zeile, wo ich die ofstream meinem Vektor hinzuzufügen versuchen, erzeugt ein Fehler. Was übersehe ich?

+3

Diese schlägt fehl, da 'ofstream' keinen Kopierkonstruktor hat. –

+0

Ich denke, du kannst einen verschieben? – Hurkyl

Antwort

12

Wenn Sie C++ 11 verwenden können Sie std::move verwenden, wenn nicht nur Zeiger (intelligente Zeiger) in Vektor speichern.

streams.push_back(std::move(out)); 

oder mit intelligenten PTRs

vector<std::shared_ptr<ofstream> > streams; 
for (int i = 0; i < numStreams; i++){ 
    std::shared_ptr<ofstream> out(new std::ofstream); 
    string fileName = "text" + to_string(i) + ".txt"; 
    out->open(fileName.c_str()); 
    streams.push_back(out); 
} 
+1

Mit 'std :: move' funktioniert! Ersparte mir eine Menge Ärger, danke! – Tim

9

Sie vector::emplace_back statt push_back verwenden können, wird dies die Ströme direkt in den Vektor erstellen, damit der Kopierkonstruktor nicht benötigt wird:

std::vector<std::ofstream> streams; 

for (int i = 0; i < numStreams; i++) 
{ 
    std::string fileName = "text" + std::to_string(i) + ".txt"; 
    streams.emplace_back(std::ofstream{ fileName }); 
} 
Verwandte Themen