2017-02-02 1 views
0

Ich arbeite an einer CGI-Anwendung, die Antwortheader, einschließlich Content-Length, vor dem Körper senden muss, aber das ist natürlich unbekannt, bis der Körper vollständig gebildet ist. Ich konnte nur einen String verwenden und verketten, wie ich gehe, aber ich mag mit dem < < Operator wie bei cout, so habe ich diese kleine Klasse:Benutzerdefinierter Ausgabepuffer für CGI-Programm, Operator überladen

#include <iostream> 

using namespace std; 

class outbuf { 
    public: 
     void operator<<(const char *str) { 
      this->buffer+= str; 
     } 

     void operator<<(const string &str) { 
      this->buffer+= str; 
     } 

     void obsend() { 
      cout << this->buffer; 
      this->buffer.clear(); 
     } 

    private: 
     string buffer; 
}; 

int main(int argc, char **argv, char** envp) { 
    outbuf cbout; 
    string s = " of the output buffer."; 

    cbout << "This is "; 
    cbout << "a test" << " ..."; 
    cbout << s; 

    cbout.obsend(); 

    return 0; 
} 

Das Problem kommt mit cbout << "a test" << " ..."; Auf dem zweiten Operator, der Compiler beschwert invalid operands of types 'void' and 'const char [5]' to binary 'operator<<' Ich verstehe den Fehler, aber nicht sicher, was ich dagegen tun soll. Gibt es einen besseren Weg, um das zu erreichen, was ich versuche? This article sah vielversprechend aus, aber ich bin nicht in der Lage zu verstehen, wovon er spricht, und es scheint nicht genau zu passen, was ich versuche zu tun.

Antwort

1

Ihre operator<< Überlastung sollte einfach eine Referenz auf sich selbst zurück:

outbuf &operator<<(const char *str) { 

// ... 

    return *this; 
} 

So, jetzt das Ergebnis des ersten << Betreiber das gleiche Objekt ist, gegen die die zweite, angekettet, << Operator glücklich verwenden.

Ändern Sie alle Ihre << Bediener auf diese Weise arbeiten.

+0

Super! Klappt wunderbar. Vielen Dank! – alanlittle