ここでは 2 つのことが行われています。
最初の問題は、エラー メッセージの一部しか含めていないことです。 gcc と clang でコンパイルされているコードへのリンクと、結果のエラー メッセージの 1 つ (全文) を次に示します。
main.cpp:13:34: error: call to 'min' is ambiguous
cout<<"minimum string is: "<<min(a,b)<<'\n';
^~~
/usr/include/c++/v1/algorithm:2579:1: note: candidate function [with _Tp = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
min(const _Tp& __a, const _Tp& __b)
^
main.cpp:6:3: note: candidate function [with C = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
C min(C a,C b) {
^
候補は2つ。1 つはmain.cpp:6:3
(行 6、文字 3) に、もう 1 つはalgorithm:2579:1
(行 2579、文字 1) にあります。
そのうちの 1 つはあなたが書いたもので、そのうちの 1 つは#include <algorithm>
.
<algorithm>
要求せずに含まれているヘッダー ファイルの 1 つ。標準ヘッダーはこれを行うことができますが、これは面倒なこともあります。
関数テンプレート<algorithm>
があります。のテンプレート クラスのインスタンスとstd::min
同様に、関数テンプレートは、「引数依存ルックアップ」または「ケーニッヒ ルックアップ」と呼ばれるプロセスによって検出されます。(関数オーバーロードの候補は、ローカルで検索され、関数の引数の名前空間、関数の引数のテンプレート引数の名前空間、および関数の引数が指すものの名前空間でも検索されます。機能など)std::string
namespace std
std::min
min
の本体と同じ名前空間にあるため、ローカル関数も見つかりますmain
。
どちらも同じように適切に一致し、コンパイラはどちらを呼び出すかを決定できません。そのため、これを伝えるエラーが生成されます。
gcc と clang の両方error:
が一連のnote:
s を実行します。通常、エラーの後のすべての はnote:
、エラーを理解する上で重要です。
これを修正するには、呼び出し::min
(呼び出しを完全に修飾する) を試すか、関数の名前を別のものに変更するか、バージョンをstd::min
(トリッキーですが、場合によっては実行可能)よりも適切に一致させるか、呼び出しを試してください(min)(a,b)
。最後のブロックは ADL/Koenig ルックアップをブロックし、マクロ展開もブロックします (たとえば、一部の OS が#define min
システム ヘッダーにマクロを挿入した場合) (@ 0x499602D2 経由)。