Also, ich habe versucht, eine Funktion wie folgt zu schreiben:Kann typeof (std :: endl) nicht als Template-Parameter haben?
void append_to_stream(std::ostream &stream)
{ }
template <typename T, typename... Args>
void append_to_stream(std::ostream &stream, T first, Args&&... rest)
{
stream << first;
append_to_stream(stream, rest...);
}
und nennen es mag:
append_to_stream(stream,
std::endl,
std::endl);
Aber das funktioniert nicht. Ich bekomme einen Fehler, der 'zu viele Argumente' für die Funktion sagt. Ich habe es bis zu dem Punkt eingegrenzt, an dem ich weiß, dass die std::endl
Schuld ist - wahrscheinlich, weil es eine Funktion ist. Ich habe es geschafft, dies zu "lösen", indem ich eine Struktur mit dem Namen endl
deklariere und die <<operator
dafür definiere, so dass sie einfach std::endl
aufruft. Das funktioniert, fühlt sich aber nicht besonders gut an. Ist es nicht möglich, std :: endl als Template-Argument zu akzeptieren? Die Funktion funktioniert für andere Typen.
Edit: hier ist der Fehler:
src/log/sinks/file_sink.cpp:62:21: error: too many arguments to function ‘void log::sinks::append_to_stream(std::string&, Args&& ...) [with Args = {}, std::string = std::basic_string<char>]’
aktualisieren
Der Versuch, den Compiler zu erhalten, die richtigen Vorlage Argumente abzuleiten @MooingDuck schlug vor, dass eine Funktion der folgenden Form verwendet werden könnten:
template<class e, class t, class a>
basic_ostream<e,t>&(*)(basic_ostream<e,t>&os) get_endl(basic_string<e,t,a>& s)
{
return std::endl<e,t>;
}
Dies kompiliert jedoch nicht.
Fehler:
src/log/sinks/file_sink.cpp:42:28: error: expected unqualified-id before ‘)’ token
src/log/sinks/file_sink.cpp:42:53: error: expected initializer before ‘get_endl’
Irgendwelche Ideen, warum? Um dies zu kompilieren, habe ich hinzugefügt using namespace std;
sein, was Compiler sind Sie mit?IIRC einige Compiler hatten Probleme mit Rekursion für eine Weile. – Flexo
@awoodland Ich benutze GCC 4.6.2 :) – Max
'std :: endl' ist keine Funktion, es ist eine Vorlage. –