Неоднозначная ошибка компилятора C ++ - PullRequest
8 голосов
/ 02 февраля 2011

Следующий бит кода не компилируется. Ошибка, кажется, является своего рода неоднозначным вызовом процедуры слияния. Насколько я понимаю, в STL есть процедура слияния, найденная в пространстве имен std, но насколько я могу судить, имя слияния в приведенном ниже коде должно быть уникальным.

Если я переименую merge в xmerge, все будет работать. В чем может быть проблема? откуда происходит столкновение имен?

http://codepad.org/uAKciGy5

#include <iostream>
#include <iterator>
#include <vector>

template<typename InputIterator1,
         typename InputIterator2,
         typename OutputIterator>
void merge(const InputIterator1 begin1, const InputIterator1 end1,
           const InputIterator2 begin2, const InputIterator2 end2,
           OutputIterator out)
{
   InputIterator1 itr1 = begin1;
   InputIterator2 itr2 = begin2;
   while ((itr1 != end1) && (itr2 != end2))
   {
      if (*itr1 < *itr2)
         *out = *itr1, ++itr1;
      else
         *out = *itr2, ++itr2;
      ++out;
   }
   while (itr1 != end1) *out++ = *itr1++;
   while (itr2 != end2) *out++ = *itr2++;
}

int main()
{
   std::vector<int> l1;
   std::vector<int> l2;
   std::vector<int> merged_list;

   merge(l1.begin(),l1.end(),
         l2.begin(),l2.end(),
         std::back_inserter(merged_list));

   return 0;
}

1 Ответ

17 голосов
/ 02 февраля 2011

Компилятор запутывается между вашей merge функцией и std::merge, определенным в algorithm. Используйте ::merge, чтобы устранить эту неоднозначность. Этот вызов неоднозначен, так как компилятор использует Аргумент Dependendent Lookup для поиска функции при использовании неквалифицированного имени функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...