В коде нет ничего плохого;Comeau Online, Intel C ++ 11.1 и g ++ 4.1.2 успешно скомпилируют его.
Я думаю, это ошибка компилятора.Недавно я представил связанный, но немного другой отчет об ошибке с компилятором Visual C ++ 2010.
В качестве обходного пути вы можете обернуть вызовы:
template <typename T>
T get_limits_min() { return std::numeric_limits<T>::min(); }
template <typename T>
T get_limits_max() { return std::numeric_limits<T>::max(); }
template <typename T> void function(T arg1,
T min = get_limits_min<T>(),
T max = get_limits_max<T>())
{
}
Гадкий?Совершенно.
В ответ на сообщение об ошибке, о котором вы сообщили в Microsoft Connect, я опубликовал следующее:
Основной шаблон должен иметьпараметр, который имеет значение аргумента по умолчанию.Значением аргумента по умолчанию должна быть функция-член шаблона класса, не входящего в глобальное пространство имен.
Ниже приведен минимальный воспроизводимый код:
namespace N
{
template <typename T>
struct S
{
static T g() { return T(); }
};
}
template <typename T> void f(T = N::S<T>::g()) { }
template <> void f<>(int) { }
int main()
{
f<int>();
}
Компилятор выдает следующие ошибки:в строке, где определен основной шаблон:
error C2589: '::' : illegal token on right side of '::'
error C2059: syntax error : '::'
Интересно, что существует другая проблема, если шаблон класса находится в глобальном пространстве имен.С учетом следующего кода:
template <typename T>
struct S
{
static T g() { return T(); }
};
template <typename T> void f(T = ::S<T>::g()) { }
template <> void f<>(int) { }
int main()
{
f<int>();
}
Компилятор выдает следующую ошибку в строке, в которой определен основной шаблон:
error C2064: term does not evaluate to a function taking 0 arguments
Оба эти примера тестовых примера правильно сформированыПрограммы на C ++.