【问题标题】:GCC 4.1.1 doesn't compile some code with tr1::unordered_mapGCC 4.1.1 不使用 tr1::unordered_map 编译一些代码
【发布时间】:2012-12-26 10:33:25
【问题描述】:

我有以下代码来测试一个更大程序的一个概念,我尝试在 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 测试.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,真>Б─≥ /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: 实例化自Б─≤Internal: :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: 实例化自Б─≤Internal: :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 > > >,假>Б─≥ 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;

它编译成功,但这不是我想要做的。 任何想法,建议,如何使这项工作?

【问题讨论】:

  • “我不能使用旧版本的编译器”?为什么不使用更新的版本的编译器?
  • GCC 4.1.1 可以追溯到 2006 年 5 月。您的“公司限制”是 r#$@%^!d
  • 抱歉我的英语不好 - 我的意思是“新”。我已经在问题文本中解决了这个问题。所以想法是必须使用 GCC 4.1.1
  • 您有两个选择:不使用该代码,或者升级到更新的编译器。如果您的公司不允许您升级,您需要告诉他们您无法完成您的工作,因为他们强迫您使用有缺陷的过时软件。
  • 我的“公司限制”不是我要征求您意见的主题。如果您不能/不想提供帮助,最好不要泛滥。

标签: c++ gcc stl unordered-map tr1


【解决方案1】:

它抱怨它没有long long的哈希函数,所以只需添加

_my_tr1_hashtable_define_trivial_hash(long long);

你应该很高兴。


附:我认为使用 TXM* 而不是 TXM 起作用的原因是因为编译器不必解析 TXM 类型,如果它是一个指针,所以它不会走上找出它没有一切的路径需要构造该类型..即长长散列函数。如果您稍后尝试创建 TXM 对象的实例,那么它会向您抱怨与您现在看到的类似的错误。

【讨论】:

  • 非常感谢。这有帮助。
猜你喜欢
  • 2021-03-05
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多