CLANG++:错误:对"分区"的调用不明确

clang++: error: call to 'partition' is ambiguous

本文关键字:调用 不明确 分区 CLANG++ 错误      更新时间:2023-10-16
#include <algorithm>
#include <vector>
template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition(BidirectionalIterator first,
    BidirectionalIterator last, UnaryPredicate pred)
{
    while (first != last) {
        while (pred(*first)) {
            ++first;
            if (first == last) return first;
        }
        do {
            --last;
            if (first == last) return first;
        } while (!pred(*last));
        std::swap(*first, *last);
        ++first;
    }
    return first;
}
int main() {
    std::vector<int> v = { 1, 55, 17, 65, 40, 18, 77, 37, 77, 37 };
    partition(v.begin(), v.end(), [](const int &i) {
        return i < 40;
    });
    return 0;
}

代码无法编译。clang++(3.5.2/cygwin)和Visual Studio(2013)都抱怨不明确的调用。由于没有使用using指令,我不明白出了什么问题。要成功编译,使用前缀会有所帮助::

您的partitionstd::partition有名称冲突

即使没有 std:: 前缀,它这样做的原因是因为它对带有std::命名空间的参数使用参数依赖查找 (ADL),这些参数std::vector<int>::iterator 。因此,编译器能够"看到"std::partition函数以及partition函数。

来自 cpp 偏好(强调我的)

对于函数调用表达式中的每个参数以及模板函数的每个模板参数,将检查其类型以确定它将添加到查找中的关联命名空间和类集