C2057: ожидаемое постоянное выражение
-
23-12-2019 - |
Вопрос
Я не могу компилировать это на 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 должен сделать это на первом этапе. Не связан с StackOverflow