NLTemplate: C2280 - Verweis auf gelöschte Funktion



  • Mrgn,

    ich versuche gerade einen Seitengenerator in C++ (Compiler = cl.exe aus VS2015) zu schreiben; einfach aus Spaß. (Wenn er fertig ist, mache ich hier natürlich einen großen Ankündigungsbeitrag, damit ihr meinen grauenhaften Code genüßlich zerreißen könnt. ;)) Als Templatesystem nutze ich NLTemplate. Das geht an sich auch ganz gut, der Democode dort auf der Seite arbeitet wie gewünscht. Jetzt würde ich aber gern die Parserlogik in eine eigene Methode auslagern, damit ich nicht für jede einzelne Ausgabeseite den gleichen Code immer wieder schreiben muss.

    Allerdings geht das nicht so, wie ich das gern hätte:

    src\main.cpp(155): error C2280: "std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>>::basic_stringstream(const std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>> &)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\sstream(631): note: Siehe Deklaration von "std::basic_stringstream<char,std::char_traits<char>,std::allocator<char>>::basic_stringstream"

    In Zeile 155 steht der Aufruf meiner Renderfunktion:

    LoaderFile loader;
    Template t(loader);
    
    stringstream ret, ss_indir, ss_outdir, ss_tpl_index;
    ss_indir << "indir/";
    ss_outdir << "outdir/";
    ss_tpl_index << "templates/default/index.txt";
    
    renderTemplate(t, ss_indir, ss_outdir, "index.htm", ss_tpl_index, ret); // Zeile 155
    

    Die Signatur von renderTemplate:

    void renderTemplate(Template t, stringstream in, stringstream out, string filename, stringstream tpl, stringstream &ss_ret)
    

    (Ich brauche ss_ret später noch mal, ich baue mir damit eine Art "Protokoll" zusammen, deswegen hätte ich da gern eine Reference.)

    Und jetzt mal ganz, ganz langsam:

    Hä?



  • stringstream hat keinen Copykonstrunktor. In, out und tpl sind also das Problem.


  • Mod

    Streams im allgemeinen, und somit auch Stringstreams im speziellen, sind nicht kopierbar. Man kann sie daher nicht direkt als Argumente einer Funktion benutzen, da dazu eine Kopie nötig wäre. Du möchtest möglicherweise lieber eine Referenz auf die Streams als Funktionsargument benutzen. Aber Funktionen die speziell einen Stringstream erwarten sind sehr, sehr ungewöhnlich. Soll das nicht vielleicht eher ein allgemeiner istream/ostream/iostream oder möglicherweise sogar ein input- bzw. output-Iterator sein? Und weiterhin der Dateiname vielleicht eher ein Stream? Dein derzeitiges Design ist extrem restriktiv für den Benutzer, obige Vorschläge würden deine Funktion sehr viel besser benutzbar machen, ohne erkennbare Nachteile.



  • Nun ja, an dieser Stelle im Code hätte ich halt gern ein paar concatenierte Strings. Sind das automatisch alles istreams (statt stringstreams)? Wahrscheinlich hat Java mich da verdorben, da macht man ja alles mit Stringbuffern.

    Aber wie sage ich der Funktion dann, dass sie meinen ret-Stream weiterschreiben soll, wenn ich ihn nicht übergeben kann?



  • Der ret Stream ist als einziger unproblematsich. Liest du eigentlich die Antworten?



  • Ach so! Ich dachte, stringstream wäre allgemein ein Problem. Nein, ich stand nur gerade auf dem Schlauch. Alles andere als string zu übergeben löst den Fehler. Puh...

    Erst mal vielen Dank.


Log in to reply