Domanda

Sto cercando di utilizzare un istante di una classe personalizzata come parametro di template.

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

template <class Foo, Foo foo>
struct Bar {

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

Il compilatore afferma che x non può apparire in un'espressione costante. Perché quel? C'è tutto dato per costruire l'oggetto al momento della compilazione.

È stato utile?

Soluzione

Non puoi farlo. Standard 14.1 dice:

  

4 Un non-tipo di modello-parametro assume uno dei seguenti tipi (opzionalmente cv-qualificato):
  - integrale o il tipo di enumerazione,
  - puntatore a oggetto o puntatore a funzione,
  - riferimento all'oggetto o riferimento alla funzione,
  -. Puntatore a membro
   5 [Nota: altri tipi non sono consentiti in modo esplicito sotto o implicitamente dalle norme che regolano la forma di template-argomenti   (14.3). Nota -end] il CV-qualificazioni di alto livello sul modello di parametri vengono ignorati quando si determina la sua   tipo.

Altri suggerimenti

Come altri hanno fatto notare, non si può fare. Fino a quando non si sta giocando i giochi di meta-programmazione, il modo normale di passare un'istanza effettiva di una classe è nel costruttore:

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

parametri di modello può essere tipi, o costanti integrali. X è un tipo, ma non è x. Non è inoltre possibile utilizzare i valori in virgola mobile costanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top