C2057:o esperado expressão constante
-
23-12-2019 - |
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)
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.