Problem mit Forward Deklaration bei Templates
-
Tach...
HumeSikkins schrieb:
Hallo,
erstmal solltest du dich fragen, ob der char_type von cbBasicTextFile
ein andere sein kann als der von cbTextLine.Nein, nein ... cbTextLine verwaltet ja nur eine einzelne Zeile der Datei ... Da die Datei vollständig in einem Zeichensatz codiert ist, ist char_type = chartype.
HumeSikkins schrieb:
Die Zeile:
Zitat:typedef cbTextLine<char_type> line_type;
ist käse, da cbTextLine hier noch gar nicht deklariert ist.
Korrekt wäre:
template <class X> class cbTextLine; typedef cbTextLine<char_type> line_type;Wie gesagt, die Forward - Deklaration ist mein eigentliches Problem, weil mir der Compiler in o.g. Form Fehler meldet.
thx
-
byteone schrieb:
HumeSikkins schrieb:
erstmal solltest du dich fragen, ob der char_type von cbBasicTextFile
ein andere sein kann als der von cbTextLine.Nein, nein ... cbTextLine verwaltet ja nur eine einzelne Zeile der Datei ... Da die Datei vollständig in einem Zeichensatz codiert ist, ist char_type = chartype.
Na dann gibt es aber auch keinen Grund dafür, die innere Klasse cbTextLine zu einem Template zu machen. Dann reicht auch schlicht:
template<typename char_type> class cbBasicTextFile { private: protected: typedef std::basic_string<char_type> str_type; class cbTextLine; // Vorwärtsdeklaration nötig für typedef typedef cbTextLine line_type; class cbTextLine { private: str_type strLine; str_type* pstrKey; str_type* pstrValue; unsigned long ulLine; unsigned long ulOffset; bool bValid; public: cbTextLine(const unsigned long, const unsigned long, std::basic_fstream<char_type> * const, const std::basic_string<char_type>&) ; line_type& SetOffset(const unsigned long); line_type& SetLineNo(const unsigned long); void Serialize(); void Unserialize(); str_type GetLine(); str_type GetKey(); str_type GetValue(); line_type& SetLine(const cbTextLine&); }; public: };
-
Tach...
Erstma sorry für den Doppel - Post ... is wohl beim editieren was schief gegangen!
Ja, du hast vollkommen Recht ... bin mit den Templates noch nicht so fit .. naja hamma wieder was gelernt! Danke!!
[edit]
Noch mal schnell ne Frage, zwar offtopic, aber trotzdem:Gesetzt den Fall, ich leite eine Klasse von cbBasicTextFile ab, welche Zugriffrechte hat die Ableitung auf die privaten Elemente von cbTextLine? Konnte das leider auf die schnelle im Stroustrup nich nachlesen!
Danke!
[/edit]
-
byteone schrieb:
Gesetzt den Fall, ich leite eine Klasse von cbBasicTextFile ab, welche Zugriffrechte hat die Ableitung auf die privaten Elemente von cbTextLine? Konnte das leider auf die schnelle im Stroustrup nich nachlesen!
Keine. Die abgeleitete Klasse hat Zugriff auf die Protected-Element der Basisklasse. In deinem Fall kann eine abgeleitete Klasse deshalb die Klasse cbTextLine verwenden. Allerdings nur so wie eine "normale" Klasse auch. Sprich: sie kann die öffentliche Schnittstelle verwenden, hat aber keinen Zugriff auf protected bzw. private-Element.
-
Tach...
Noch eine letzte Frage, wieder offtopic .. aber eben gleiches Problem. Hab jetzt folgende Klassendeklaration:
template <class char_type> class cbBasicTextFile { public: typedef std::basic_string<char_type> str_type; typedef std::basic_fstream<char_type> strm_type; protected: // cbTextLine has to manage a single line in the file class cbTextLine { private: strm_type* pstrmFile; unsigned long ulLine; unsigned long ulOffset; bool bValid; str_type strLine; str_type* pstrKey; str_type* pstrValue; public: cbTextLine(const unsigned long, const unsigned long, strm_type * const, const str_type&); cbTextLine& SetOffset(const unsigned long); cbTextLine& SetLineNo(const unsigned long); void Serialize(); void Unserialize(const str_type&); str_type GetLine(); str_type GetKey(); str_type GetValue(); cbTextLine& SetLine(const str_type&); cbTextLine& SetKey(const str_type&); cbTextLine& SetValue(const str_type&); }; };Wenn ich jetzt allerdings versuche, dass ganze zu implementieren:
template<class char_type> cbBasicTextFile<char_type>::cbTextLine& cbBasicTextFile<char_type>::cbTextLine::SetOffset( const unsigned long Offset) { return this->ulOffset = Offset; };dann spucktb der compiler folgendes aus:
MinGW schrieb:
iostrms\textfile.cpp:13: error: expected constructor, destructor, or type conversion before '&' token
iostrms\textfile.cpp:13: error: expected `;' before '&' tokenKönnte mir da jemand bitte nochmal behilflich sein?!
Danke!
-
byteone schrieb:
template<class char_type> cbBasicTextFile<char_type>::cbTextLine& cbBasicTextFile<char_type>::cbTextLine::SetOffset( const unsigned long Offset) { return this->ulOffset = Offset; };da fehlt ein }
-
ach doch nicht - verguckt.
aber laut fehlermeldung hast du irgentwo ein ; vergessen.
-
Also vorsichtshalber poste ich mal die ganze cpp:
#include "textfile.h" template<class char_type> cbBasicTextFile<char_type>::cbTextLine::cbTextLine( const unsigned long Line, const unsigned long Offset, strm_type* const Stream, const str_type& Delimiter) : ulLine(Line), ulOffset(Offset), pstrmFile(Stream) { Unserialize(Delimiter); }; template<class char_type> cbBasicTextFile<char_type>::cbTextLine& cbBasicTextFile<char_type>::cbTextLine::SetOffset( const unsigned long Offset) { return this->ulOffset = Offset; };Ich kann beim besten Willen nicht die Stelle finden, wo ein Semikolon fehlt ... der Fehler muss woanders liegen, denke das is ehr so ne Art "Folgefehler" ... nur weiß ich wirklich nich, was das Problem is ... glaub ich geh erstmam schlafen un mach morgen früh weiter ... vieleicht is ja jemandem bis dahin was eingefallen...
-
Hallo,
also erstmal ist da ein ';' zu viel. Methodendefinitionen enden nicht mit einem Semikolon.Und dann fehlt dem gcc hier offensichtlich ein typename.
template<class char_type> cbBasicTextFile<char_type>::cbTextLine& cbBasicTextFile<char_type>::cbTextLine::SetOffset(
const unsigned long Offset) {
return this->ulOffset = Offset;
}Für deinen Compiler ist der Rückgabetyp
cbBasicTextFile<char_type>::cbTextLine ein abhängiger Name. Damit er diesen als Typ (und nicht als Member) interpretiert, musst du ihn mit typename qualifizieren:template<class char_type> typename cbBasicTextFile<char_type>::cbTextLine& cbBasicTextFile<char_type>::cbTextLine::SetOffset( const unsigned long Offset) { return this->ulOffset = Offset; }
-
Tach...
HumeSikkins schrieb:
also erstmal ist da ein ';' zu viel. Methodendefinitionen enden nicht mit einem Semikolon.
Das ist mir neu ... erstaunlich, dass der Compiler vorher nie gemeckert hat?!
HumeSikkins schrieb:
Und dann fehlt dem gcc hier offensichtlich ein typename.
Genau das wars ... hätte man eigentlich drauf kommen können, da ich mich die Tage erst mit dem Kapitel Templates im Stroustrup genauer beschäftigt hab ... scheinbar mit maßigem Erfolg
Danke, jetzt kann ich erstma weitermachen!