Предупреждение компилятора C5037
"member-function": внестрочный определение элемента шаблона класса не может иметь аргументы по умолчанию
Замечания
Аргументы по умолчанию не допускаются во внешних определениях функций-членов в классах шаблонов. Компилятор выдает предупреждение /permissive
уровня 3 и ошибку в разделе /permissive-
.
Это предупреждение появилось в Visual Studio 2017 версии 15.3. Код, скомпилированный без предупреждений в версиях компилятора до Visual Studio 2017 версии 15.3, теперь может создавать C5037. Сведения об отключении предупреждений, представленных в определенной версии компилятора или более поздней версии, см. в разделе "Предупреждения компилятора" по версии компилятора. Его можно отключить с помощью /wd:5037
параметра компилятора или #pragma warning(disable:5037)
.
Пример
В предыдущих версиях Visual Studio следующий некорректный код может вызвать сбой среды выполнения. В Visual Studio 2017 версии 15.3 возникает предупреждение C5037:
// C5037.cpp
// compile using: cl /c /permissive- C5037.cpp
template <typename T>
struct A {
T f(T t, bool b = false);
};
template <typename T>
T A<T>::f(T t, bool b = false) // C5037: 'A<T>::f': an out-of-line definition of a member of a class template cannot have default arguments
{
// ...
}
Чтобы устранить такую ошибку, удалите аргумент по умолчанию = false
.