sizeof () Og Mal argument i ctor / Non-ctor Funksjon

stemmer
0

Jeg traff en ulempe i dag ... Jeg ønsket å definere en liten malbasert hjelper klasse:

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

og selvfølgelig, ville det ikke kompilere (C2027). Mitt spørsmål var, er det mulig å få størrelsen på type? Grunnen til at jeg trenger dette er at den type gjenstanden er konstruert med kan være en rekke av forskjellig definerte strukturer, og så jeg må få størrelsen på strukturen i bruk, under kjøring.

Gjennom en rask litt eksperimentering, fordi jeg er sta, virker det som jeg kan bruke sizeof (T) i ctor, men ikke i den ikke-ctor funksjon - så spørsmålet mitt nå er ... hvorfor ?!

Publisert på 24/08/2009 klokken 16:29
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Ikke sikker på hva riktig svar på spørsmålet ditt er, men det virker som du kan omgå det ved å bare gjøre iSize medlem og har GetElementSize () returnerer den i stedet for å ringe sizeof igjen.

Svarte 24/08/2009 kl. 16:43
kilden bruker

stemmer
2

Synes å fungere fint her, hva er budskapet i C2027? Og hva kompilatoren bruker du?

Svarte 24/08/2009 kl. 16:44
kilden bruker

stemmer
2

Det kan ha ulike årsaker. Vurdere denne koden:

// 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;
};

På det tidspunkt konstruktøren blir instansiert (i "CPP" fil), Ter et fullstendig definert type. Men på det tidspunktet GetElementSizeer instansiert (i ".h" fil), Xer ennå ikke fullstendig definert.

Svarte 24/08/2009 kl. 18:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more