clang ++:错误:调用'partition'是不明确的

时间:2015-06-19 16:58:59

标签: c++

#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指令,我不明白什么是错的。 要成功编译,请使用::前缀帮助。

1 个答案:

答案 0 :(得分:8)

您的partition名称与std::partition

发生冲突

即使没有std::前缀,它也是这样做的原因是因为它在std::vector<int>::iterator的参数上使用argument dependent lookup (ADL),它带有std::命名空间。因此,编译器能够看到&#34; std::partition函数以及partition函数。

From cppreference(强调我的)

  

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