Pergunta

Eu não posso compilar isso em VS2013, mas ele não compile o gcc 4.7.2.Eu entendo VC++ está ficando para trás GCC e CLang em termos de recursos, mas que recurso é exatamente e se não for isso é um bug, não é?

template <int N>
struct factorial
{
    static const long value;
    static const long previous = factorial<N - 1>::value; //C2057: expected constant expression
};

template <int N>
const long factorial<N>::value = N*factorial<N - 1>::value;

template <>
struct factorial<0>
{
    static const long value = 1;
};

Por favor, não me diga como eu posso obter uma solução alternativa a esse problema, fazer com que este não é um código de produção nem eu precisar de um.Por exemplo, eu posso definir o valor na classe e o problema é resolvido, mas vamos supor que eu defina-a para fora da classe (VC2013 ainda não suporta constexpr)

Foi útil?

Solução

MSVC não tem uma adequada de duas fases, modelo de compilação.GCC corretamente vê factorial<N - 1>::value como um nome do dependente e resolve na segunda fase, mas MSVC tem de fazê-lo na primeira fase.

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