2010-10-05 10 views
7

Ich habe eine Klasse etwas wie folgt aus:Konstruktor für ein No-Namen struct

template <class T> 
class bag 
{ 
public: 

private: 
typedef struct{void* prev; struct{T item; unsigned int count;} body; void* next;}* node; 
typedef struct{ 
    node operator->() { return current; } 
    operator(){;} // <- i can not do that, right? 

private: 
    node current; 
} iterator; 
//... 
}; 

So, wie ein Konstruktor für die Tasche :: Iterator zu schreiben?

+0

Eine "no-named" -Struktur wird anonyme genannt. –

+0

@Peter G .: nicht anonym, dies ist eine "unbenannte Klasse definiert in einer typedef-Deklaration" '7.1.3/5' – Cubbi

+0

Danke Cubbi, ich stehe korrigiert. –

Antwort

6

es einige schöne Namen machen :-)

typedef struct NoName1 {void* prev; NoName1(){}; struct NoName2{T item; unsigned int count; NoName2() {}} body; void* next;}* node; 

EDIT: LOL sorry, es für die falsche geschrieben, aber das Prinzip ist das gleiche :-)

5

Es gibt keine Möglichkeit, schreiben Sie einen Konstruktor für bag::iterator weil Iterator ein typedef Name ist, die aus der Nutzung als Konstruktor Namen sind verboten:

14882:2003 12.1/3

ein typedef-name der Name einer Klasse darf nicht als Bezeichner im Deklarator für eine Konstruktor-Deklaration verwendet werden.

Es gibt sogar ein Beispiel in dem Standard, wenn auch in einem anderen Absatz, 7.1.3/5:

typedef struct { 
    S();   //error: requires a return type because S is 
       // an ordinary member function, not a constructor 
} S; 

Sie geben müssen, dass Sie einen Namen struct, wenn Sie einen benutzerdefinierten Konstruktor wollen. Die typedef struct { } name; Art der Programmierung wird in der Regel von C++ - Formatvorlagen sowieso zugunsten von struct name { }; abgeraten.