C2057: espressione costante attesa
-
23-12-2019 - |
Domanda
Non riesco a compilare questo su VS2013, ma compila il GCC 4.7.2.Capisco che VC ++ è in ritardo dietro GCC e Clang in termini di funzionalità, ma quale caratteristica è esattamente e se non questo è un bug, non è?
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;
};
.
Per favore non dirmi come posso ottenere una soluzione alternativa di questo problema, perché questo non è un codice di produzione né ne ho bisogno.Ad esempio, posso definire il valore nella classe e il problema è risolto, ma supponiamo di doverlo definirlo fuori dalla classe (VC2013 ancora non supporta ConstexPR)
Soluzione
MSVC non ha una corretta compilation del modello a due fasi.GCC vede correttamente factorial<N - 1>::value
come nome dipendente e si risolve nella seconda fase, ma MSVC deve farlo nella prima fase.