编译器错误 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.
}