コンパイラ エラー C2672

'function': 一致するオーバーロード関数が見つかりません

コンパイラは、指定された関数と一致するオーバーロードされた関数を見つけることができませんでした。 一致するパラメーターを取る関数が見つからなかったか、コンテキスト内に必要なアクセシビリティを備えた一致する関数がありません。

特定の標準ライブラリのコンテナーまたはアルゴリズムで使用されている場合、ご自身の型は、コンテナーまたはアルゴリズムの要件を満たす、アクセス可能なメンバーまたはフレンド関数を提供する必要があります。 たとえば、お使いの反復子の型は、std::iterator<> から派生している必要があります。 コンテナー要素型上での比較演算または他の演算子の使用には、型を左側と右側の両方のオペランドとして考慮しなければならない場合があります。 型を右側のオペランドとして使用するには、演算子を、型の非メンバー関数として実装する必要があります。

Visual Studio 2017 より前のバージョンのコンパイラでは、一部のテンプレートのコンテキストで修飾名のアクセス確認が実行されませんでした。 これは、名前にアクセスできないために置換が失敗すると予想される場合に、予期される SFINAE の動作に干渉する可能性があります。 コンパイラが演算子の誤ったオーバーロードを誤って呼び出すために、これが原因でクラッシュまたは実行時に予期しない動作が発生する可能性があります。 Visual Studio 2017 年では、コンパイラ エラーが発生します。

次の例の場合、Visual Studio 2015 ではコンパイルされますが、Visual Studio 2017 ではエラーが発生します。 この問題を解決するには、テンプレート パラメーター メンバーが、評価される場所にアクセスできるようにします。

#include <type_traits>

template <class T> class S {
// public:    // Uncomment this line to fix
    typedef typename T type;
};

template <class T, std::enable_if<std::is_integral<typename S<T>::type>::value, T> * = 0>
bool f(T x)
{
    return (x == 0);
}

int main()
{
    f(10); // C2672: No matching overloaded function found.
}