espressione costante con oggetto personalizzato
-
22-09-2019 - |
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.
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.