2016-06-08 6 views
1

Ich Problem in der Zusammenstellung der folgenden Code-Schnipsel, während GNU mit g ++ 4.9.2 (verwendet in g zu kompilieren ok ++ 2.95.3)Overloading Endl Kompilation Ausgabe in GNU g ++ 4.9.2

XOStream &operator<<(ostream &(*f)(ostream &)) { 
     if(f == std::endl) { 
       *this << "\n" << flush; 
     } 
     else { 
       ostr << f; 
     } 
     return(*this); 
} 

Der Fehler ist wie folgt:

error: assuming cast to type 'std::basic_ostream<char>& (*)(std::basic_ostream<char>&)' from overloaded function [-fpermissive] 
    [exec] if(f == std::endl) { 
    [exec]    ^

Bitte führen/helfen.

+0

Hinweis: Um läuft in diese Art von Problemen zu vermeiden können Sie einen XOStreamBuffer schreiben und hänge es an den XOStream an (ein fast unveränderter ostream) –

+0

Also, warum lässt du 'endl' nicht einfach sein Ding machen? Weil Sie 'flush' auf der' XOStream' Ebene statt auf der 'ostr' Ebene abfangen wollen? Sie könnten auch das 'else' vereinfachen, um' f (ostr); 'direkt zurückzugeben ... Ich denke, wenn es auch einen ähnlichen Hack macht, wird das nicht funktionieren. – Yakk

Antwort

3

Wählen Sie die Überlastung von std::endl mit einem static_cast:

#include <iostream> 
#include <iomanip> 

inline bool is_endl(std::ostream &(*f)(std::ostream &)) { 
    // return (f == static_cast<std::ostream &(*)(std::ostream &)>(std::endl)); 
    // Even nicer (Thanks M.M) 
    return (f == static_cast<decltype(f)>(std::endl)); 
} 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << is_endl(std::endl) << '\n'; 
    std::cout << is_endl(std::flush) << '\n'; 
} 
+1

oder 'static_cast ' –

2

std::endl ist eine Funktionsvorlage, Sie müssen die Vorlagenargumente angeben. Weil Sie verwenden std::ostream (dh basic_ostream<char>) könnten Sie

if (f == endl<char, std::char_traits<char>>)