2009-08-24 6 views
0

je frappe aujourd'hui accroc ... Je voulais définir une petite classe d'aide basé sur un modèle:sizeof() et le modèle Argument Dans cteur/non-cteur Fonction

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

et bien sûr, il ne serait pas compiler (C2027). Ma question était, est-il possible d'obtenir la taille du type? La raison pour laquelle j'ai besoin de ceci est que le type avec lequel l'objet est construit pourrait être un nombre de structures définies différemment, et donc j'ai besoin de connaître la taille de la structure utilisée, au moment de l'exécution. Par un peu d'expérimentation, parce que je suis têtu, il semble que je peut utiliser sizeof (T) dans le ctor, mais pas dans la fonction non-ctor - alors ma question est maintenant ... Pourquoi?!

+3

Avez-vous vraiment essayé de compiler ce même code? Il manque une 'classe' ou' struct' entre 'template < class T >' et 'CMyClass'. Si vous ajoutez 'class', gcc compilera très bien. – Tobias

+0

Aussi, essayez "std :: size_t". Le code dans le constructeur peut sembler fonctionner, mais il n'est généralement pas compilé jusqu'à ce que le constructeur soit instancié lors de la création d'un objet de 'CMyClass '. –

Répondre

1

Vous ne savez pas quelle est la bonne réponse à votre question, mais il semble que vous pouvez contourner ce problème en créant simplement un membre iSize et que GetElementSize() le renvoie au lieu d'appeler à nouveau sizeof.

+0

Je l'ai découvert à la fin, bien que j'ai aussi trouvé que lorsque j'essaie d'extraire le code pertinent à un petit exemple, il n'échoue plus. – JTeagle

2

Cela semble fonctionner correctement ici, quel est le message de C2027? Et quel compilateur utilisez-vous?

+0

J'utilise VS2005, patché - je crois que cela s'appelle VC8 ou VC8.1? Le texte intégral d'erreur est: MyClass.h (170): erreur C2027: utilisation de type non défini 'T' voir la déclaration de 'T' lors de la compilation fonction membre modèle de classe « size_t CMyClass :: GetElementSize (void) const ' avec [ T = T] voir référence à modèle de classe instanciation CMyClass ' étant compilé avec [ T = T] et il a été instancié avec \t CMyClass ElementStore; où SOME_STRUCT_DEF contient trois flottants et un DWORD + son propre ctor. – JTeagle

+0

Yikes, désolé de la perte de formatage là-bas. – JTeagle

+0

En fait, je dois retirer cette question. Cela ne semble pas se produire dans tous les cas - en particulier, lorsque j'essaie d'extraire les os nus et de créer un échantillon de test compilable, cela ne se produit pas. Grrr! – JTeagle

2

Il peut avoir différentes raisons. Considérez ce 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; 
}; 

Au moment où le constructeur est instancié (dans le fichier « .cpp »), T est un type complètement défini. Mais au moment GetElementSize est instancié (dans le fichier ".h"), X n'est pas encore complètement défini.

+0

@litb: Je pense que cette erreur nécessiterait une recherche en deux phases, alors que "C2027" fait allusion à VC - qui ne l'implémente malheureusement pas. – sbi

+0

Je ne suis pas sûr de quoi que ce soit avec VC. Ce compilateur est trop cassé pour que j'assume quelque chose à ce sujet :) –

+0

@sbi: Il n'y a pas de recherche en 2 phases ici.La recherche en deux phases est le terme utilisé pour décrire la recherche qui a lieu dans la portée des types d'arguments, pour un appel de fonction impliquant des arguments dépendants. –

Questions connexes