コンパイラ警告 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 を削除します。