0

次のコードがあります。

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm>

template <typename Type> inline Type max(Type t1, Type t2) { 
    return t1 > t2 ? t1 : t2; 
}

template <typename Type> inline Type max(const std::vector<Type> &vec) { 
    return *std::max_element(vec.begin(),vec.end());
} 

template <typename Type> inline Type max(const Type *parray, int size) {
return *std::max_element(parray,parray+size);
} 

int main(int argc, char *argv[]) {
    std::string sarray[] = {"we","were","her","pride","of","ten"};
    std::vector<std::string> svec(sarray,sarray+6);

    int iarray[] = {12,70,2,169,1,5,29};
    std::vector<int> ivec(iarray,iarray+7);

    float farray[] = {2.5,24.8,18.7,4.1,23.9};
    std::vector<float> fvec(farray,farray+5);

    int imax = max(max(ivec),max(iarray,7));
    float fmax = max(max(fvec),max(farray,5));
    std::string smax = max(max(svec),max(sarray,6));

    std::cout << "imax should be 169  -- found: " << imax << '\n'
              << "fmax should be 24.8 -- found: " << fmax << '\n'
              << "smax should be were -- found: " << smax << '\n';
    return 0; 
} 

ベクトルと配列の最大要素を出力する 2 つの単純なテンプレート関数を実装しようとしています。ただし、タイプが文字列の場合、次のエラーが発生します。

error: call of overloaded 'max(std::string, std::string)' is ambiguous

なぜこのようなことが起こるのでしょうか? また、それを改善する最善の方法は何ですか?

4

3 に答える 3

3

問題は、コンパイラがADLmaxを介して複数の一致する定義を見つけており、どれを選択すればよいかわからないことです。

max修飾 ID を使用するように呼び出しを変更してみてください。

std::string smax = ::max(max(svec),max(sarray,6));
于 2013-03-27T18:54:44.970 に答える
3

あなたのコード

std::string smax = max(max(svec),max(sarray,6));

に変換:

std::string smax = max(string ,string ); 

Aftermax(svec)max(sarray,6)は、テンプレートを使用して評価されます。ここで問題が発生します。標準ライブラリには、テンプレート化された max() 関数が既に付属しています。max()コンパイラは、またはのバージョンが必要かどうかを判断できませんstd::max()。ここで、整数と浮動小数点で機能する理由を尋ねます。答えは、具体的に言及しているこの行にありますstd::string。したがって、コンパイラは混乱しています。回避策がある場合があります。しかし、最善の解決策が必要なので、最大関数の名前を MAXimum に変更します。

于 2013-03-27T19:02:17.173 に答える
0

なぜこれが起こっているのですか?
コンパイラエラーはすでに理由を示しています。のどのバージョンを使用するかはわかりませんmax

注: 候補は次のとおりです:
main.cpp:6:38: 注: Type max(Type, Type) [with Type = std::basic_string]
...
/usr/include/c++/4.7/bits/stl_algobase.h:210 :5: 注意: const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = std::basic_string]

解決策:
関数 を明示的に呼び出すmaxか、単に呼び出すだけですstd::max(これは既に存在するので、なぜ再実装する必要があるのでしょうか?)。

さらに、;後に1つ多すぎます<< "fmax should be 24.8 -- found: " << fmax << '\n'

于 2013-03-27T18:58:41.043 に答える