コンパイルエラーを回避するには?

解決


おにさん  2012-06-28 16:25:07  No: 73440  IP: 192.*.*.*

#include <hash_map>

template <typename T1, typename T2, typename U=std::hash_compare<T1, std::less<T1> >, template <class> class U2=private_allocator>
struct hash_map : public std::hash_map<T1, T2, U, U2<std::pair<T1, T2> > > {};


上記の定義で、下記のエラーでます。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
error C2955: 'gdf_com::hash_map' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
'gdf_com::hash_map' の宣言を確認してください。
: コンパイルされたクラスの テンプレート のインスタンス化 'gdf_com::hash_map<T1,T2,U,U2>' の参照を確認してください
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Microsoft Visual C++ 2003では、エラーなかったようです。

エラーの回避方法教えてください。

編集 削除
επιστημη  URL  2012-06-28 21:05:56  No: 73441  IP: 192.*.*.*

Visual C++ 2010 では再現できませんでした。コンパイル・エラーになりません。

#include <hash_map>
#include <functional>

namespace gdf_com {
template<typename T> class private_allocator : public std::allocator<T>  {};

template <typename T1, typename T2, typename U=std::hash_compare<T1, std::less<T1> >, template <class> class U2=private_allocator>
struct hash_map : public std::hash_map<T1, T2, U, U2<std::pair<T1, T2> > > {};
}

int main() {
  gdf_com::hash_map<int,int> map;
}

編集 削除
おにさん  2012-06-29 09:21:26  No: 73442  IP: 192.*.*.*

おはようございます。
早速のご返答ありがとうございます。
やはり、Visual C++ 2010ではエラーになりませんかー。
情報提供感謝します。

編集 削除
επιστημη  URL  2012-06-29 23:44:09  No: 73443  IP: 192.*.*.*

↑「やはり」って、どーゆーことですか?

編集 削除
おにさん  2012-07-02 10:21:23  No: 73444  IP: 192.*.*.*

すいません、2010では試す気はなかったのですが
回りの情報では、2010ではエラーにならないのでは・・・って
声があったのもですから・・・。

実際にリコンパイルしたいのは
Visual C++ 2008 なので、まだ解決には至っていません。
貴方様の情報は、報告に使わさせていただきました。
ありがとうございます。

編集 削除
tetrapod  2012-07-02 19:02:09  No: 73445  IP: 192.*.*.*

C++ 言語規格書 ISO/IEC 14882:1998 に hash_map は無い。
処理系独自拡張のライブラリを std 名前空間におくのはダメ、ということで
VS2005 や VS2008 では hash_map は stdext 名前空間に移っている。
http://msdn.microsoft.com/en-us/library/0d462wfh(v=vs.90).aspx
# VS2010 で std::hash_map が定義されているのは規格違反かな?
stdext::hash_map にすればコンパイル通るだろう。

> template <class> class U2=private_allocator
っていうのは俺の理解では文法違反なのだがなぜコンパイル通るんだろう?

いかんせん処理系独自拡張なので VC++ ではうまく動いても g++ では動かない。

編集 削除
επιστημη  URL  2012-07-02 22:13:22  No: 73446  IP: 192.*.*.*

え? g++だとこれ↑ダメなの?

編集 削除
tetrapod  2012-07-03 07:19:42  No: 73447  IP: 192.*.*.*

「これ」がどこの話なのかわからないけど cygwin 1.7.15 の g++ 4.5.3 では
0. そもそも backward deprecated である。
1. hash_map は名前空間 __gnu_cxx 中においてある
2. hash_compare という比較関数は無い (__gnu_cxx::equal_to になってる)
ので、その辺はダメっぽい。独自拡張と書いたのはこの辺を意図してるです。

3. template<class> U2=... は規格書みてみたけど、通るはずっすね。
template の型パラメータが template で、型識別子省略の場合ですな。
実際に g++ でもうまくコンパイルできました。

編集 削除
おにさん  2012-07-03 09:25:03  No: 73448  IP: 192.*.*.*

おはようございます。
皆様の、アドバイスどおり
以下にしたら、解決しました)
std::hash_map ⇒  stdext::hash_map

とりあえず、今回は過去の資産をVisual C++ 2008で、リコンパイル
することが第一段階の目的でしたので、本当に助かりました。

επιστημηさん、tetrapodさん

忙しいところありがとうございました。

編集 削除
 2012-07-03 09:26:21  No: 73449  IP: 192.*.*.*

ありがとうございます。
解決しました。

編集 削除
επιστημη  URL  2012-07-03 19:27:50  No: 73450  IP: 192.*.*.*

>「これ」がどこの話なのかわからないけど

あ、すんません。

>> template <class> class U2=private_allocator
> っていうのは俺の理解では文法違反なのだがなぜコンパイル通るんだろう


ここんとこ。

# hash_map が stdext にあったのを VS2010 でわざわざ std に
# 持ち込んだのでConnectに文句いうてやったのを思い出した。

編集 削除