Pergunta

Estou tentando usar um instante de uma classe personalizada como um parâmetro de modelo.

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

template <class Foo, Foo foo>
struct Bar {

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

O compilador afirma que x não pode aparecer em uma expressão constante. Porquê isso? Há tudo dado para construir esse objeto no momento da compilação.

Foi útil?

Solução

Você não pode fazer isso. O padrão 14.1 diz:

4 Um parâmetro de modelo não do tipo deve ter um dos seguintes tipos (opcionalmente qualificado por CV):
- Tipo integral ou de enumeração,
- Ponteiro para objeto ou ponteiro para funcionar,
- referência ao objeto ou referência à função,
- Ponteiro para membro.
5 Nota: outros tipos são proibidos explicitamente abaixo ou implicitamente pelas regras que governam a forma de Argumentos de modelos(14.3). -nota] Os qualificadores CV de nível superior no parâmetro de modelo são ignorados ao determinar seu tipo.

Outras dicas

Como outros apontaram, você não pode fazer isso. Desde que você não esteja jogando jogos de meta-programação, a maneira normal de passar em uma instância real de uma classe está no construtor:

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

Parâmetros de modelo podem ser tipos ou constantes integrais. X é um tipo, mas x não é. Você também não pode usar valores constantes de ponto flutuante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top