1

より大きなプログラムから 1 つの概念をテストする次のコードがあり、Linux で GCC 4.1.1 を使用してコンパイルしようとしています。企業環境の制限により、新しいバージョンのコンパイラを使用できないため、現在利用可能なコンパイラ バージョンでコンパイルして動作させる必要があります。

// test.cpp - my tr1::unordered_map usage example
#include <iostream>
#include <tr1/unordered_map>

namespace YY {

class X { public: X(int z_val = 0); private: int z; };
inline X::X(int z_val) : z(z_val) {}

enum XTE { Xt1, Xt2, Xt3 };

}

namespace std { namespace tr1 {

#define _my_tr1_hashtable_define_trivial_hash(T)        \
  template<>                                            \
    struct hash<T>                                      \
    : public std::unary_function<T, std::size_t>        \
    {                                                   \
      std::size_t                                       \
      operator()(T val) const                           \
      { return static_cast<std::size_t>(val); }         \
    }                                                     

_my_tr1_hashtable_define_trivial_hash(YY::XTE);

#undef _my_tr1_hashtable_define_trivial_hash
}}


namespace YY {
typedef std::tr1::unordered_map<long long, X*> TXM;
typedef std::tr1::unordered_map<XTE, TXM> TTXM;
}

int main()
{
    YY::TTXM m;
    std::cout << m.size();
    return 0;
}

次に、このコードをコンパイルしようとすると、gcc で次のエラーが表示されます。

$ g++ -c test.cpp
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable: Б─≤Internal のインスタンス化:: hash_code_base, Internal::extract1st >, std::equal_to, std::tr1::hash, Internal::mod_range_hashing, Internal::default_ranged_hash, false>Б─≥:
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable:1014: Б─≤std からインスタンス化: :tr1::hashtable, std::allocator >, Internal::extract1st >, std::equal_to, std::tr1::hash, Internal::mod_range_hashing, Internal::default_ranged_hash, Internal::prime_rehash_policy, false, false, true>Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/unordered_map:63: Б─≤std からインスタンス化: :tr1::unordered_map, std::equal_to, std::allocator >, false>Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/bits/stl_pair.h:74: Б─≤ からインスタンス化std::pair, std::equal_to, std::allocator >, false> >Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable:413: Б─≤内部からインスタンス化: :extract1st, std::equal_to, std::allocator >, false> > >Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable:861: Б─≤内部からインスタンス化: :hash_code_base, std::equal_to, std::allocator >, false> >, Internal::extract1st, std::equal_to, std::allocator >, false> > >, std::equal_to, std::tr1:: hash, Internal::mod_range_hashing, Internal::default_ranged_hash, false>Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable:1014: Б─≤std からインスタンス化: :tr1::hashtable, std::equal_to, std::allocator >, false> >, std::allocator, std::equal_to, std::allocator >, false> > >, Internal::extract1st, std:: equal_to, std::allocator >, false> > >, std::equal_to, std::tr1::hash, Internal::mod_range_hashing, Internal::default_ranged_hash, Internal::prime_rehash_policy, false, false, true>Б─≥
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/unordered_map:63: Б─≤std からインスタンス化: :tr1::unordered_map, std::equal_to, std::allocator >, false>, std::tr1::hash, std::equal_to, std::allocator, std::equal_to, std::allocator >, false > > >, false>Б─≥
test.cpp:42: ここからインスタンス化
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/hashtable:863: エラー: Б─≤内部: :hash_code_base::m_h1Б─≥ には不完全な型があります
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/../../../../include/c++/4.1.1/tr1/functional:1101: エラー: Б─≤ の宣言struct std::tr1::hashБ─≥

test.cpp:42: ここからインスタンス化されるのは

YY::TTXM m;

私が変われば

typedef std::tr1::unordered_map<XTE, TXM> TTXM;

の中へ

typedef std::tr1::unordered_map<XTE, TXM*> TTXM;

正常にコンパイルされますが、これは私がやりたいことではありません。アイデア、提案、これを機能させる方法はありますか?

4

1 に答える 1

3

のハッシュ関数がないという不満があるlong longので、追加するだけです

_my_tr1_hashtable_define_trivial_hash(long long);

そして、あなたは行ってもいいはずです。


PSTXMの代わりにTXM*を使用する理由は、コンパイラーがポインターの場合はTXM型を解決する必要がないため、すべてが揃っていないことを理解するための道をたどらないためだと思います。その型を構築する必要があります。つまり、longlongハッシュ関数です。後でTXMオブジェクトのインスタンスを作成しようとすると、現在表示されているものと同様のエラーで文句を言います。

于 2013-01-11T19:39:03.327 に答える