2016-12-05 16 views
1

Ich habe einen virtuellen Typ Methode int_type in code being adapted from here, dass der einzige Fall, in dem der Code den Compiler-Fehler gibt:INT_TYPE nicht Typ Frustration Namensgebung

‘int_type’ does not name a type 
int_type ThreadLogStream::overflow(int_type v) 
^. 

Debuggen Schritte bisher

  • Wenn ich über eine andere Instanz von int_type in der Qt Creator IDE schwinge, wird traits_type::int_type std::basic_streambuf::int_type angezeigt, was bedeutet, dass jede andere Instanz von int_type nicht verursacht werden sollte Probleme.

  • Laut this reference gehört der int_type tatsächlich zu basic_streambuf, aber der Aufruf Traits::int_type hat nicht funktioniert.

  • Ich habe versucht, die Problemvariable zu definieren, wie in den folgenden typedefs gezeigt, aber char_type und traits_type wurden nicht erkannt.

threadlogstream.cpp

... 
int_type ThreadLogStream::overflow(int_type a) 
{ 
    int_type b = a; //This gives no errors 

    return b; 
} 
... 

threadlogstream.hpp

#include <iostream> 
#include <streambuf> 
#include <string> 

//typedef std::basic_streambuf< char_type, traits_type> base_class; 
//typedef typename base_class::int_type int_type; 

class ThreadLogStream : public QObject, std::basic_streambuf<char> { 

    Q_OBJECT 

public: 
    ThreadLogStream(std::ostream &stream); 
    ~ThreadLogStream(); 

protected: 
    virtual int_type overflow(int_type v); // This gives no errors 
    virtual std::streamsize xsputn(const char *p, std::streamsize n); 
} 

Bitte helfen - Ich verliere das Haar über.

+0

Dies soll nicht Kompilieren, wenn 'int_type' nicht im globalen Namespace angezeigt wird.Sie müssen einen qualifizierten Namen für den Rückgabetyp verwenden, wenn eine Funktion außerhalb der Klasse deklariert wird. – AnT

Antwort

1

Es scheint, dass Ihre int_type für std::basic_streambuf<>::int_type stehen soll. In diesem Fall in einem out-of-Klasse Mitglied Definition soll man

ThreadLogStream::int_type ThreadLogStream::overflow(int_type a) 
{ 
    ... 

heißt verwenden, um einen qualifizierte Namen für die Funktion Rückgabetyp schreiben. Parameternamen werden im Klassenbereich nachgeschlagen (daher wird in der Parameterliste nur int_type zusammengestellt). Aber Rückgabetypen werden im umschließenden Umfang nachgeschlagen, weshalb Sie sie explizit qualitätsbeeinträchtigen müssen.

So war es schon immer in C++.

jedoch der Rückgabetyp Rückgabetyp Syntax (verfügbar seit seit C++ 11) in Hinter nachgeschlagen auch in Klassenbereich auf, was bedeutet, dass Sie diese alternativ tun können

auto ThreadLogStream::overflow(int_type a) -> int_type 
{ 
    ... 
1

Sieht aus wie Sie ihm einen abschließender Rückgabetyp machen müssen, etwa so:

auto ThreadLogStream::overflow(int_type v) -> int_type { 
    // ... 
} 

Erläuterung: int_type Bedürfnisse im Rahmen der ThreadLogStream nachgeschlagen werden, aber wenn Sie einen führenden Rückgabetyp, es wird im Namespace-Bereich nachgeschlagen, da es vor kommt, erwähnen Sie den Namen ThreadLogStream::overflow, der Nachschlagen im Bereich ThreadLogStream auslöst. Durch Platzieren des Rückgabetyps nach die qualifizierte-ID wird dieses Problem vermieden.

+0

Sollte nicht "auto" vorne sein? – Pixelchemist

+0

@Pixelchemist ja, sorry, ich habe es behoben – Brian

Verwandte Themen