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.

¿Fue útil?

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 ) {
      ...
    }
};
parámetros

plantilla puede ser tipos, o constantes integrales. X es un tipo, pero no es x. Tampoco se puede utilizar valores constantes de punto flotante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top