2009-08-24 13 views
0

ich einen Haken heute getroffen ... Ich wollte eine kleine Templat-Helfer-Klasse definierensizeof() Und Vorlage Argument In Ctor/Non-Ctor Funktion

template<class T> 
CMyClass 
{ 
public : 
    CMyClass() { size_t iSize = sizeof(T); } // Allowed. 
    size_t GetElementSize() const { return sizeof(T); } // C2027. 
}; 

und natürlich wäre es nicht kompilieren (C2027). Meine Frage war, ist es möglich, die Größe des Typs zu bekommen? Der Grund, warum ich das brauche, ist, dass der Typ, mit dem das Objekt erstellt wird, eine Anzahl unterschiedlich definierter Strukturen sein kann. Daher muss ich zur Laufzeit die Größe der verwendeten Struktur ermitteln.

Durch ein schnelles bisschen experimentieren, weil ich stur bin, scheint es, dass ich sizeof (T) in der Ctor verwenden kann, aber nicht in der Nicht-Ctor-Funktion - so meine Frage ist jetzt ... Warum?!

+3

Haben Sie wirklich versucht, diesen Code zu kompilieren? Es fehlt eine 'class' oder eine' struct' zwischen 'template < class T >' und 'CMyClass'. Wenn Sie 'class' hinzufügen, wird gcc problemlos kompiliert. – Tobias

+0

Versuchen Sie auch "std :: size_t". Der Code im Konstruktor scheint zu funktionieren, aber er wird normalerweise nicht kompiliert, bis der Konstruktor beim Erstellen eines Objekts von 'CMyClass ' instanziiert wird. –

Antwort

1

Nicht sicher, was die richtige Antwort auf Ihre Frage ist, aber es scheint, dass Sie umgehen können, indem Sie iSize ein Mitglied machen und GetElementSize() es zurückgeben, anstatt sizeof erneut aufzurufen.

+0

Ich habe dies am Ende entdeckt, obwohl ich auch festgestellt habe, dass es nicht mehr fehlschlägt, wenn ich versuche, den relevanten Code zu einem kleinen Beispiel zu extrahieren. – JTeagle

2

Scheint hier gut zu funktionieren, was ist die Nachricht von C2027? Und welchen Compiler benutzen Sie?

+0

Ich benutze VS2005, gepatcht - ich glaube, das heißt VC8 oder VC8.1? Der vollständige Fehlertext ist: MyClass.h (170): Fehler C2027: Verwendung von undefinierten Typ 'T' siehe Erklärung von 'T', während Klassen-Template-Memberfunktion ‚size_t CMyClass Kompilieren :: GetElementSize (void) const ' mit [ T = T ] siehe Verweis auf Klassenvorlage Instanziierung CMyClass ' mit kompilierten [ T = T ] und es mit instanziiert wurde \t CMyClass ElementStore; wobei SOME_STRUCT_DEF drei Floats und ein DWORD + einen eigenen ctor enthält. – JTeagle

+0

Huch, Entschuldigung wegen des Verlustes der Formatierung dort. – JTeagle

+0

Eigentlich muss ich diese Frage zurückziehen. Es scheint nicht in allen Fällen zu passieren - besonders, wenn ich versuche, die Knochen zu extrahieren und eine kompilierbare Testprobe zu erstellen, passiert es nicht. Grrr! – JTeagle

2

Es kann verschiedene Gründe haben. Betrachten Sie diesen Code:

// file foo.h 
class X; 

template<class T> 
class CMyClass 
{ 
public : 
    CMyClass() { size_t iSize = sizeof(T); } // Allowed. 
    size_t GetElementSize() const { return sizeof(T); } // C2027. 
}; 

struct Class { 
    Class(); // definition of it in the cpp file, where "X" is fully defined 
    void callit() { cm.GetElementSize(); } // instantiated here! 
    CMyClass<X> cm; 
}; 

Zu der Zeit wird der Konstruktor (in der „CPP“ Datei) instanziiert, ist T ein vollständig definierten Typ. Aber zu der Zeit, GetElementSize ist instanziiert (in der ".h" Datei), X ist noch nicht vollständig definiert.

+0

@litb: Ich denke, dass dieser Fehler eine zweiphasige Suche erfordern würde, während "C2027" auf VC deutet - was dies leider nicht implementiert. – sbi

+0

Ich bin nicht sicher über irgendetwas mit VC. Dieser Compiler ist zu sehr kaputt, als dass ich irgendetwas davon annehmen könnte :) –

+0

@sbi: Hier gibt es kein 2-Phasen-Lookup.2-Phasen-Lookup ist der Begriff, der verwendet wird, um die Suche zu beschreiben, die im Rahmen der Argumenttypen für einen Funktionsaufruf stattfindet, der abhängige Argumente einbezieht. –