rdbuf(): Fehlermeldung "keine passende Funktion für Aufruf ..."
-
Hallo,
ich möchte in meinem Programm die Einträge in ein Log-File in die cerr umleiten, falls es Probleme mit dem Log-File gibt. Dazu folgender Code:
In der Header-Datei:
std::ofstream m_logfile;
In der Quelltext-Datei:
# include <Header-Datei>
# include <iostream>
# include <fstream>…
using namespace std;
//*************************************************************************
int ClassName::Funktion()
{
…
if …
m_logfile.rdbuf(cerr.rdbuf());
…
}Beim Kompilieren erhalte ich folgende Fehlermeldung:
Fehler: keine passende Funktion für Aufruf von »std::basic_ofstream<char, std::char_traits<char> >::rdbuf(std::streambuf*&)«
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/fstream:596: Anmerkung: Kandidaten sind: std::basic_filebuf<_CharT, _Traits>* std::basic_ofstream<_CharT, _Traits>::rdbuf() const [with _CharT = char, _Traits = std::char_traits<char>]Der Compileraufruf lautet:
g++ -g -O -Wall -c -o File.o File.cpp
Würde mich über einen Tipp sehr freuen.
Vielen Dank
Uli
-
Zwar ist aus deinem Quelltext nicht ganz ersichtlich, was du damit erreichen willst, aber du hast schlicht und einfach rdbuf() mit den falschen Argumenten aufgerufen. Das sagt dir doch auch schon die Fehlermeldung: du hast einen streambuf übergeben, obwohl rdbuf keine Argumente erwartet.
http://www.cplusplus.com/reference/iostream/ofstream/rdbuf.html
-
Hallo pumuckl,
vielen Dank für deine Antwort.
Ich kann sie nachvollziehen. Leider wird mir dadurch noch nicht klar wird, wie ich weiterkomme.
Im Grundsatz möchte ich das Gegenteil der vielen Beispiele (cout in eine Datei umlenken, z.B. http://www.cplusplus.com/reference/iostream/ios/rdbuf.html) machen, nämlich die Ausgabe in eine Datei nach cerr umlenken - beispielsweise bei einem Problem mit der Datei (Zugriffsproblem, ...). Natürlich möglichst elegant, d.h. ohne an mehreren Stellen die Alternativausgabe für cerr zu programmieren.
Hättest du da evtl. einen Vorschlag.
Viele Grüße
Uli
-
Schreib mal deine Zuweisung in 2 Zeilen (wie auch im Referenz-Beispiel angegeben) und poste danach noch mal die (ganze) Fehlermeldung...
@pumuckl: rdbuf(streambuf
gibt es auch (zum Setzen des Streampuffers)...
-
~stream schrieb:
@pumuckl: rdbuf(streambuf
gibt es auch (zum Setzen des Streampuffers)...Wenn ich das richtig sehe, dann ist das rdbuf() von ios geerbt, allerdings durch rdbuf() von ofstream verdeckt...
-
@pumuckl: Du hast recht, die Funktion wird überdeckt (und nicht mittels using freigegeben).
Aber dann kann man sie trotzdem noch aufrufen:
m_logfile.std::ios::rdbuf(std::cerr.rdbuf()); // beachte: std::ios:: !!!Folgendes Testprogramm hat bei meinem BCB5-Compiler geklappt:
m_logfile.open("test.txt"); m_logfile << "hello" << std::endl; // output to logfile m_logfile.std::ios::rdbuf(std::cerr.rdbuf()); m_logfile << "error" << std::endl; // output to cerr (console)
-
Vielen Dank für euere Hilfe - funktioniert.
Viele Grüße
Uli