人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++のテンプレートに関する質問です。
下記のソースをcygwinのgcc(v4.3.4)でコンパイルするとエラーとなります。

エラー内容
$ gcc -o test temp5.cpp -lstdc++
temp5.cpp: In function ‘int main()’:
temp5.cpp:12: error: call of overloaded ‘max(int, int)’ is ambiguous
temp5.cpp:6: note: candidates are: X max(X, X) [with X = int]
/usr/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/bits/stl_algobase.h:210: note:
const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]


何が間違っているのか、教えてください。
VC++6.0ではコンパイル可能です。
宜しくお願いします。

以下ソース
---------------------------------
#include <iostream>
using namespace std;

template <typename X>

X max(X var1 , X var2) {
if (var1 > var2) return var1;
else return var2;
}

int main() {
cout << max(10 , 100);
return 0;
}

●質問者: mizore_chan
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C++ const cygwin gcc i686
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tdoi
●35ポイント

エラーメッセージそのものなのですが、STLの中(stl_algobase.h)に以下の定義があります。

namespace std {
 template<typename _Tp>
 inline const _Tp&
 max(const _Tp& __a, const _Tp& __b)
 {
 // concept requirements
 __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
 //return __a < __b ? __b : __a;
 if (__a < __b)
 return __b;
 return __a;
 }
}

mizore_chanさんのコード中にも次のような定義があります。

template <typename X>
X max(X var1 , X var2) {
if (var1 > var2) return var1;
else return var2;
}

前者の方は、std名前空間中のmaxという関数、後者はグローバルスコープ中のmaxという関数で実態は異なりますので、定義自体は問題ありません。きっちり名前空間を書けば、

std::max
::max

という別の名前になります。

ところが、コードの先頭で、

using namespace std;

と記述しているため、std名前空間は省略可能になります。

すると、

max(10 , 100);

という呼び出しが、


std::max(10 , 100);

なのか

::max(10 , 100);

なのかが判別つかないという意味のエラーです。

確認していませんが、対処方としては、上記のように名前空間を明示してあげればよいかと思います。

なお、VC6で問題なく動作するということに関しては、ある種のVC6のバグのようなもので、windows.hで定義されているマクロにより、std::maxやstd::minが使えません。そのため、曖昧さが発生せずに問題なく動作します。

なお、こちらの解決策は、次のサイトなどで紹介されているように、NOMINMAXをdefineしてあげれば解決します。

http://d.hatena.ne.jp/pyopyopyo/20100329/p1

恐らくですが、stdafx.hなどをincludeする前に、NOMINMAXをdefineするとVC6でも同じエラーが出ると思います。

何かの参考になれば。

◎質問者からの返答

ありがとう御座います。

名前空間なのですね。

Cでいったら、includeしたライブラリに同じ名前の関数があった、というようなことでしょうか。

ともかく、上記内容を確認してみます。


2 ● taroe
●35ポイント

http://chiebukuro.toremaga.com/dir/detail/q1352135323/

http://www.anarg.jp/personal/t-tugawa/note/cpp/namespace_acciden...

◎質問者からの返答

ありがとう御座います。

名前空間を調べました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ