Pregunta

No puedo compilar esto en VS2013, pero sí compila el GCC 4.7.2.Entiendo que VC ++ se está quedando atrás detrás de GCC y se agota en términos de características, pero ¿qué característica es exactamente y, si no esto es un error, no?

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, no me digas cómo puedo obtener una solución de este problema, porque este no es un código de producción, ni necesito uno.Por ejemplo, puedo definir el valor en la clase y el problema se resuelve, pero supongamos que tengo que definirlo fuera de la clase (VC2013 todavía no es compatible con ConsexPR)

¿Fue útil?

Solución

MSVC no tiene una compilación de plantillas de dos fases adecuada.GCC ve correctamente generalmente factorial<N - 1>::value como un nombre dependiente y se resuelve en la segunda fase, pero MSVC tiene que hacerlo en la primera fase.

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