3

次のコードは、コンパイル時にコンパイラ エラーをスローします。

template <typename T>
inline T const& max (T const& a, T const& b)
{
    return a < b ? b : a;
}

// maximum of two C-strings (call-by-value)
inline char const* max (char const* a, char const* b)
{
    return strcmp(a,b) < 0 ? b : a;
}

// maximum of three values of any type (call-by-reference)
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
    return max (max(a,b), c); 
}

int main ()
{
    ::max(7, 42, 68);  
}

コンパイル時にエラーが発生します:

エラー: オーバーロードされた 'max(const int&, const int&)' の呼び出しがあいまいです

注: 候補は次のとおりです。

注: const T& max(const T&, const T&) [with T =int]

注: const char* max(const char*, const char*)

呼び出しに一致するテンプレート メソッドがある場合、 max(const char*, const char*) は max(const int&, const int &) にどのようにほぼ一致しますか?

4

1 に答える 1

1

using namespace stdあなたのコードにあるに違いない。取り除けば大丈夫です。

比較: http://ideone.com/Csq8SVhttp://ideone.com/IQAoI6

名前空間 std を厳密に使用する必要がある場合は、ルート名前空間の呼び出しを強制できます ( で行う方法main()):

template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
    return ::max(::max(a,b), c); 
}
于 2013-10-08T09:36:19.940 に答える