2015-06-19 1 views
7
#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, я не понимаю, что случилось. Чтобы успешно скомпилировать, используется префикс ::.clang ++: error: call to 'partition' неоднозначно

ответ

8

Ваш partition имеет имя столкновение с std::partition

Причина это делает так, даже без префикса std:: потому, что она использует argument dependent lookup (ADL) на аргументы, которые std::vector<int>::iterator, которые несут std:: имен. Поэтому компилятор способен «видеть» функцию std::partition, а также функцию partition.

From cppreference (курсив мой)

... for every argument in a function call expression and for every template argument of a template function, its type is examined to determine the associated set of namespaces and classes that it will add to the lookup

Смежные вопросы