我无法在 VS2013 上编译它,但它可以在 gcc 4.7.2 上编译。我知道 VC++ 在功能方面落后于 GCC 和 CLang,但它到底是什么功能,如果不是,这就是一个错误,不是吗?
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;
};
请不要告诉我如何解决此问题,因为这不是生产代码,我也不需要。例如我可以在类中定义值,问题就解决了,但假设我必须在类外定义它(VC2013 仍然不支持 constexpr)
最佳答案
MSVC 没有适当的两阶段模板编译。 GCC 正确地看到 factorial<N - 1>::value
作为从属名称并在第二阶段解析,但 MSVC 必须在第一阶段完成。
关于c++ - C2057 : expected constant expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23054793/