Lebensdauer von "typedef"
-
Habe mehrere Klassen welche einen eingen typ verwenden:
typedef std::list<AllocNode>::iterator pos_type;Wo muss ich diese Typdef deklarieen das es überall gilt?
Wenn ich es bspw in eine Header deklarier, ist das typedef dann nur da gütlig?
kann das sein das der compiler mekert wenn ich sowas mache:
pos_type Y; std::list<AllocNode>::iterator X= Y; //<-- cast fehler
-
BorisDieKlinge schrieb:
Wo muss ich diese Typdef deklarieen das es überall gilt?
An einer Stelle, die überall dort sichtbar ist, wo der Typedef benutzt wird.
Wenn ich es bspw in eine Header deklarier, ist das typedef dann nur da gütlig?
Was meinst du mit "nur da"? Wenn der Typedef in einer Headerdatei steht, dann ist er in allen .cpp-Dateien verfügbar, die diesen Header direkt oder indirekt einbinden. Eine Headerdatei allein tut ja nichts.
kann das sein das der compiler mekert wenn ich sowas mache:
pos_type Y; std::list<AllocNode>::iterator X= Y; //<-- cast fehlerJa, wenn pos_type an der Stelle nicht bekannt ist.
-
bei typedef verhält es sich ganz genau so wie bei variablen.
pos_type Y; std::list<AllocNode>::iterator X= Y;der Comiler wird bei deinem Code nicht meckern da ein typedef kein eigener typ ist, sondern nur ein anderer name für ihn.
-
ok danke.. jungs...
Aber Problem:
//headerdatei class AllocNode; typedef std::list<AllocNode>::iterator type_pos; class CVirtTreeList{ //Verwendung von type_pos class AllocNode{ //Verwendung von type_pos .... }; .... };habe jetzt 15 mal "std::list<AllocNode>::iterator " mit "type_pos" ersetzt..
67 Errors:
d:\test\StruktureGriuping\VirtTreeList.h(57): error C2027: Verwendung des undefinierten Typs "AllocNode" d:\test\StruktureGriuping\VirtTreeList.h(57): error C2039: 'm_iLevel': Ist kein Element von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] e:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\list(220): Siehe Deklaration von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] d:\test\StruktureGriuping\VirtTreeList.h(66): error C2678: Binärer Operator '!=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operator vom Typ 'Node_Iter' akzeptiert (oder keine geeignete Konvertierung möglich) d:\test\StruktureGriuping\VirtTreeList.h(68): error C2027: Verwendung des undefinierten Typs "AllocNode" d:\test\StruktureGriuping\VirtTreeList.h(13): Siehe Deklaration von 'AllocNode' d:\test\StruktureGriuping\VirtTreeList.h(68): error C2039: 'm_iLevel': Ist kein Element von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] e:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\list(220): Siehe Deklaration von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] d:\test\StruktureGriuping\VirtTreeList.h(86): warning C4804: '>=': unsichere Verwendung des Typs 'bool' in einer Operation d:\test\StruktureGriuping\VirtTreeList.h(95): error C2027: Verwendung des undefinierten Typs "AllocNode" d:\test\StruktureGriuping\VirtTreeList.h(13): Siehe Deklaration von 'AllocNode' d:\test\StruktureGriuping\VirtTreeList.h(95): error C2039: 'm_iLevel': Ist kein Element von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] e:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\list(220): Siehe Deklaration von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] d:\test\StruktureGriuping\VirtTreeList.h(96): warning C4018: '>': Konflikt zwischen 'signed' und 'unsigned' d:\test\StruktureGriuping\VirtTreeList.h(100): error C2664: 'std::list<_Ty>::iterator std::list<_Ty>::insert(std::list<_Ty>::iterator,const _Ty &)': Konvertierung des Parameters 1 von 'Node_Iter' in 'std::list<_Ty>::iterator' nicht möglich with [ _Ty=CVirtTreeList::AllocNode ] and [ _Ty=CVirtTreeList::AllocNode ] Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig d:\test\StruktureGriuping\VirtTreeList.h(101): error C2027: Verwendung des undefinierten Typs "AllocNode" d:\test\StruktureGriuping\VirtTreeList.h(13): Siehe Deklaration von 'AllocNode' d:\test\StruktureGriuping\VirtTreeList.h(101): error C2039: 'm_itThis': Ist kein Element von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] e:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\list(220): Siehe Deklaration von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] d:\test\StruktureGriuping\VirtTreeList.h(105): error C2440: 'return': 'std::allocator<_Ty>::value_type' kann nicht in 'CVirtTreeList::AllocNode &' konvertiert werden with [ _Ty=AllocNode ] Ein Verweis, der nicht auf ein 'const' zeigt, kann nicht an einen Wert gebunden werden, bei dem es sich nicht um einen L-Wert handelt d:\test\StruktureGriuping\VirtTreeList.h(116): error C2027: Verwendung des undefinierten Typs "AllocNode" d:\test\StruktureGriuping\VirtTreeList.h(13): Siehe Deklaration von 'AllocNode' d:\test\StruktureGriuping\VirtTreeList.h(116): error C2039: 'm_strName': Ist kein Element von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] e:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\list(220): Siehe Deklaration von 'std::list<_Ty>::iterator' with [ _Ty=AllocNode ] d:\test\StruktureGriuping\VirtTreeList.h(116): error C2228: Der linke Teil von '.c_str' muss eine Klasse/Struktur/Union sein
-
Zeig mal bitte auch eine Stelle, wo man die Benutzung sieht, ist besser als einen den Fehler lesen zu lassen

-
bspw. in funktion ChildCount:
//headerdatei class AllocNode; typedef std::list<AllocNode>::iterator type_pos; class CVirtTreeList{ //Verwendung von type_pos class AllocNode{ UINT ChildsCount(){ //Anzahl der Kindesknoten von oFather ermitteln UINT iChildCount=0; for(Node_Iter it= First_Node(); it != Last_Node(); it++) //<-- HIER (Node_Iter) if(it->m_iLevel == (this->m_iLevel+1)) iChildCount++; return iChildCount; } .... }; .... };
-
Dein Typedef verwendet den Typ AllocNode, den es wahrscheinlich (außerhalb deiner Forward Declaration) gar nicht gibt. Der Typ, den du meinst, heißt CVirtTreeList::AllocNode.
-
BorisDieKlinge schrieb:
ok danke.. jungs...
Aber Problem:
//headerdatei class AllocNode; typedef std::list<AllocNode>::iterator type_pos; class CVirtTreeList{ //Verwendung von type_pos class AllocNode{ //Verwendung von type_pos .... }; .... };Du erzeugst eine vorwärtsdeklaration von AllocNode die sich ausserhalb der Klasse befindet, die definition erfolgt aber als nested class. Das äußere AllocNode wird also nie definiert und dadurch kommt der Fehler zustande.
Eine Lösung sähe so aus:
class CVirtTreeList{ //Verwendung von type_pos class AllocNode{ //Verwendung von type_pos .... }; .... public: typedef std::list<AllocNode>::iterator type_pos; }; typedef CVirtTreeList::type_pos type_pos;
-
class CVirtTreeList{ //Verwendung von type_pos class AllocNode{ type_pos A; type_pos B; .... .... //Verwendung von type_pos .... }; .... public: typedef std::list<AllocNode>::iterator type_pos; }; typedef CVirtTreeList::type_pos type_pos;danke aber es komm immer noch 34 fehler , wahrscheinlich weil AllocNode noch mebes hat (A,B) vom typ type_pos
-
durch den typedef initialisierst du das Klassentemplate std::list<AllocNode> und damit auch die komplette Definition des Templates. Vermutlich werden in dem Template einige Methoden (z.B. Copy-CTOR und assignment operator etc.) benutzt, die aber zu der Zeit nicht bekannt sind, so dass der Compiler, der an dieser Stelle implizit die Klassendefinition von std:list<AllocNode> einfügt, meckert, weil er Methoden sieht, für die er (noch) keine Deklaration hat (weil eben die Definition von AllocNode noch nicht bekannt ist).