2013-04-06 3 views
-8

Très bien les gars!Modèles C++ - Passing Class member

Je vais avoir un petit problème ici, pour le rendre plus simple, ce qui est plus ou moins à quoi ça ressemble:

window.h

template <ObjectType &x> 
class foo { stuff } 

game.h

class gameclass { ObjectType a; } 

main.cpp

gameclass mygame; 
foo<mygame.a> fooa; 

Maintenant, le fooa échoue car il ne me permet pas d'envoyer le membre 'a' de mygame comme argument de modèle.

Maintenant, comment puis-je envoyer un membre de classe en tant que paramètre de modèle?

Merci Vous

+6

Cela n'a aucun sens. L'argument template est supposé être un * type *, pas un objet. Si vous voulez le * type * de 'a', alors faites juste' foo fooa; '. –

+0

Votre template 'foo' attend un * type *. Vous transmettez une valeur calculée au moment de l'exécution. Comment voulez-vous utiliser 'x' dans la partie marquée" stuff "? Ce que vous voulez faire n'est pas clair –

+3

Vous avez oublié de lire votre livre C++. –

Répondre

1

Il semble que vous voulez passer un paramètre de modèle non de type, et plus précisément, un pointeur à membre . Pour ce que vous voulez, vous avez à l'utilisateur:

template<ObjectType gameclass::* ptr> 
struct foo 
// ... 

Notez que vous permettra d'accéder au membre d'un objet que si vous avez un pointeur vers cet objet. Vous pouvez avoir plus de détails here (pointer-to-member as template parameter) ou here (pointer-to-members).

Notez que vous ne pouvez pas passer la valeur de mygame.a à un modèle dans le code affiché, parce que:

  1. paramètres du modèle sont la compilation, votre valeur est l'exécution.
  2. Les paramètres de modèle non typés ne peuvent pas être de type objet, uniquement intégrale (ou enum), pointeur/référence à l'objet/fonction ou pointeur vers membre.

EDIT: Vous avez changé votre modèle à template<ObjectType& x>. Ceci est correct pour reference to object. Cependant, mygame.a n'est pas une référence, c'est une valeur. Pour spécifier le membre, vous devez utiliser la syntaxe &mygame::a, qui vous oblige à utiliser un pointeur vers membre.