8

次のコードはコンパイルに失敗します。エラーは、マージルーチンへのある種のあいまいな呼び出しのようです。私の理解では、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;
}
4

1 に答える 1

17

mergeコンパイラは、関数とでstd::merge定義された関数の間で混乱していalgorithmます。::mergeこのあいまいさを取り除くために使用します。非修飾関数名が使用されている場合、コンパイラは引数依存ルックアップを使用して関数を検索するため、この呼び出しはあいまいです。

于 2011-02-02T10:17:07.890 に答える