13

テンプレートに詳しくありません。私はそれを学び始めたばかりです。次のプログラムでエラーが発生するのはなぜですか?

#include <iostream>
#include <string>
using std::cout;
using std::string;
template<class C>
C min(C a,C b) {
    return a<b?a:b;
}
int main()
{
    string a="first string";
    string b="second string";
    cout<<"minimum string is: "<<min(a,b)<<'\n';
    int c=3,d=5;
    cout<<"minimum number is: "<<min(c,d)<<'\n';
    double e{3.3},f{6.6};
    cout<<"minimum number is: "<<min(e,f)<<'\n';
    char g{'a'},h{'b'};
    cout<<"minimum number is: "<<min(g,h)<<'\n';
    return 0;
}

エラー:

13  [Error] call of overloaded 'min(std::string&, std::string&)' is ambiguous

6   [Note] C min(C, C) [with C = std::basic_string<char>]

私を助けてください。

4

2 に答える 2

16

ここでは 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::stringnamespace stdstd::min

minの本体と同じ名前空間にあるため、ローカル関数も見つかりますmain

どちらも同じように適切に一致し、コンパイラはどちらを呼び出すかを決定できません。そのため、これを伝えるエラーが生成されます。

gcc と clang の両方error:が一連のnote:s を実行します。通常、エラーの後のすべての はnote:、エラーを理解する上で重要です。

これを修正するには、呼び出し::min(呼び出しを完全に修飾する) を試すか、関数の名前を別のものに変更するか、バージョンをstd::min(トリッキーですが、場合によっては実行可能)よりも適切に一致させるか、呼び出しを試してください(min)(a,b)。最後のブロックは ADL/Koenig ルックアップをブロックし、マクロ展開もブロックします (たとえば、一部の OS が#define minシステム ヘッダーにマクロを挿入した場合) (@ 0x499602D2 経由)。

于 2015-05-15T17:14:47.920 に答える
5

との名前の競合が発生していstd::minます。あなたが含めた他の標準ライブラリヘッダーのいずれかに含まれている可能性があります。<iostream>または<string>、私の推測ではおそらく後者です。簡単な修正は、関​​数の名前を変更することです。たとえば、名前を に変更すると正常にmymin動作します。デモ

于 2015-05-15T17:14:08.047 に答える