krach mit newline



  • hallo, habe diese klasse gefunden

    class a2str 
    { 
    	stringstream ss; 
    	public: 
    		template<typename T> 
    		a2str& operator<<(T const& x) { ss<<x; return *this; } 
    		operator string() const { return ss.str(); } 
    };
    

    und würd auch gern endl benutzen, gibt aber leider ne seite voller fehler:

    error C2914: "a2str::operator <<": template-Argument kann nicht hergeleitet werden, da das Funktionsargument mehrdeutig ist.
    error C2784: "std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "std::basic_ostream<_Elem,_Traits> &" konnte nicht von "a2str" hergeleitet werden.
    ...
    usw.
    ...

    beim aufruf:

    string s = a2str() << "I want newline" << endl;
    

    ohne endl gehts, aber ich würds gern benutzen, geht das irgendwie?



  • Fehlt vielleicht das richtige Include (frag mich nicht, welches, evtl iostream)?


  • Mod

    endl ist ein Funktionstemplate, folglich

    string sss = a2str() << "I want newline" << endl<char, char_traits<char> >;
    

    oder

    string ss = a2str() << "I want newline" << static_cast<basic_ostream<char, char_traits<char> >&(*)(basic_ostream<char, char_traits<char> >&)>(endl);
    

    oder einfach noch eine entsprechende Überladung in a2str hinzufügen

    class a2str
    {
    ...
        a2str& operator<<(basic_ostream<char, char_traits<char> >& pf(basic_ostream<char, char_traits<char> >&)) { return pf(ss), *this; }
    


  • krass 😮
    funktioniert, 👍
    vielen dank! 🙂



  • endl macht bei dieser Helper-Klasse ja eigentlich keinen Sinn, da das 'flushen' für den internen 'stringstream' unnötig ist.
    Stattdessen reicht doch ein einfacher Zeilenumbruch: '\n'

    Für andere Stream-Manipulatoren (z.B. hex) ist die zusätzliche Überladung jedoch sinnvoll.



  • Seit wann sollte ein streaming op am ende noch ein newline hängen? halt ich für falsch



  • kann man die klasse auch für den wstring typen benutzen?
    hab so einiges schon probiert, aber ich kriegs nicht hin!


  • Mod

    template <typename charT, typename traitsT = std::char_traits<charT>, typename Allocator = std::allocator<charT> >
    class basic_a2str
    {
        std::basic_ostringstream<charT, traitsT, Allocator> ss;
        typedef std::basic_ostream<charT, traitsT>& manip(basic_ostream<charT, traitsT>&);
    public:
        operator std::basic_string<charT, traitsT, Allocator>() const { return ss.str(); }
        template<typename T>
        basic_a2str& operator<<(const T& x) { ss << x; return *this; }
        basic_a2str& operator<<(manip pf) { ss << pf; return *this; }	
    };
    typedef basic_a2str<char> a2str;
    typedef basic_a2str<wchar_t> a2wstr;
    


  • hhmmm...für den aufruf muss man aber die spitzen klammern benutzen, ne?
    mit überladen geht das wohl nicht irgendwie ... 😕



  • Nein, braucht man eigentlich nicht. Wie rufst du es denn auf? Beachte daß wide-char-Literale als L"..." codiert werden müssen.


Anmelden zum Antworten