expresión constante con el objeto personalizado
-
22-09-2019 - |
Pregunta
Estoy intentando utilizar un instante de una clase personalizada como un parámetro de plantilla.
class X {
public:
X() {};
};
template <class Foo, Foo foo>
struct Bar {
};
const X x;
Bar<X, x> foo;
El compilador establece que x
no puede aparecer en una expresión constante. ¿Por qué eso? Hay de todo, dada la construcción de ese objeto en tiempo de compilación.
Solución
Usted no puede hacerlo. Estándar 14.1 dice:
4 Una plantilla-parámetro no tipo deberá tener uno de los tipos (opcionalmente CV-calificado) siguientes:
- tipo integral o de enumeración,
- puntero al objeto o puntero a función,
- Referencia a objeto o referencia a la función, España - puntero a miembro de
. 5 [Nota: otros tipos no están permitidos ya sea explícita o implícitamente por debajo de las normas que rigen la forma de plantilla argumentos (14.3). -end nota] el nivel superior CV-calificadores en la plantilla-parámetro se ignoran cuando la determinación de su tipo.
Otros consejos
Como otros han señalado que no puede hacerlo. Siempre y cuando usted no está jugando juegos de meta-programación, la forma normal de pasar una instancia real de una clase es en el constructor:
template <class Foo>
struct Bar {
Bar( const Foo & f ) {
...
}
};
plantilla puede ser tipos, o constantes integrales. X
es un tipo, pero no es x
. Tampoco se puede utilizar valores constantes de punto flotante.