Question

Je suis en train d'utiliser un instant d'une classe personnalisée comme paramètre de modèle.

class X {
public:
  X() {};
};

template <class Foo, Foo foo>
struct Bar {

};
const X x;
Bar<X, x> foo;

Le compilateur indique que x ne peut pas apparaître dans une expression constante. Pourquoi ça? Il y a tout donné pour construire cet objet au moment de la compilation.

Était-ce utile?

La solution

Vous ne pouvez pas le faire. Norme 14.1 dit:

  

4 Un modèle non-paramètre de type doit avoir l'un des types suivants (éventuellement cv-qualifié):
  - type intégral ou énumération,
  - pointeur vers objet ou pointeur de fonction,
  - référence à l'objet ou une référence à la fonction,
  -. Pointeur vers un membre
   5 [Note: les autres types ne sont pas autorisés soit explicitement ci-dessous ou implicitement par les règles régissant la forme de modèle arguments   (14.3). Note -end] Le haut niveau cv-qualifiés sur le modèle paramètres sont ignorés lors de la détermination de son   le type.

Autres conseils

Comme d'autres l'ont souligné, vous ne pouvez pas le faire. Tant que vous ne jouez pas les jeux de méta-programmation, la façon normale de passer une instance réelle d'une classe est dans le constructeur:

template <class Foo>
struct Bar {
    Bar( const Foo & f ) {
      ...
    }
};

Paramètres de modèle peuvent être des types ou des constantes intégrales. X est un type, mais x n'est pas. Vous pouvez également pas utiliser des valeurs en virgule flottante constantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top