Вопрос

Я не могу компилировать это на 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 должен сделать это на первом этапе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top