我无法在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仍然不支持consexpr)

有帮助吗?

解决方案

msvc没有适当的两相模板编译。GCC正确地将生成的名称视为依赖名称并在第二阶段解析,但MSVC必须在第一阶段进行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top