Поделиться через


Предупреждение компилятора 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.