GTEST 中 std::map 和 dense_hash_map 的编译器错误

Posted

技术标签:

【中文标题】GTEST 中 std::map 和 dense_hash_map 的编译器错误【英文标题】:Compiler error with std::map and dense_hash_map in GTEST 【发布时间】:2016-10-26 06:37:15 【问题描述】:

当我尝试在我的 GOOGLE 测试中使用我的项目/模块时遇到此错误。

gcc.compile.c++ bin/gcc-4.8.3/debug/link-static/gmock_test.o
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:130:11: error: redefinition of ‘class std::tuple< <template-parameter-1-1> >’
     class tuple : public _Tuple_impl<0, _Elements...>
           ^
In file included from /usr/include/c++/4.8.2/bits/stl_map.h:63:0,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/tuple:388:11: error: previous definition of ‘class std::tuple< <template-parameter-1-1> >’
     class tuple : public _Tuple_impl<0, _Elements...>
           ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:164:20: error: redefinition of ‘class std::tuple<>’
   template<> class tuple<>  ;
                    ^
In file included from /usr/include/c++/4.8.2/bits/stl_map.h:63:0,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/tuple:512:11: error: previous definition of ‘class std::tuple<>’
     class tuple<>
           ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:168:11: error: redefinition of ‘class std::tuple<_T1, _T2>’
     class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
           ^
In file included from /usr/include/c++/4.8.2/bits/stl_map.h:63:0,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/tuple:521:11: error: previous definition of ‘class std::tuple<_T1, _T2>’
     class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
           ^
In file included from /usr/include/c++/4.8.2/tuple:38:0,
                 from /usr/include/c++/4.8.2/bits/stl_map.h:63,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/utility:83:24: error: template parameter ‘long unsigned int _Int’
   template<std::size_t _Int, class _Tp>
                        ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:223:12: error: redeclared here as ‘int __i’
     struct tuple_element;
            ^
/usr/include/c++/4.8.2/tr1/tuple:230:12: error: specialization of ‘template<long unsigned int _Int, class _Tp> struct std::tuple_element’ in different namespace [-fpermissive]
     struct tuple_element<__i, tuple<_Head, _Tail...> >
            ^
In file included from /usr/include/c++/4.8.2/tuple:38:0,
                 from /usr/include/c++/4.8.2/bits/stl_map.h:63,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/utility:84:11: error:   from definition of ‘template<long unsigned int _Int, class _Tp> struct std::tuple_element’ [-fpermissive]
     class tuple_element;
           ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:237:12: error: redefinition of ‘struct std::tuple_element<0ul, std::tuple<_El0, _El ...> >’
     struct tuple_element<0, tuple<_Head, _Tail...> >
            ^
In file included from /usr/include/c++/4.8.2/bits/stl_map.h:63:0,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/tuple:687:12: error: previous definition of ‘struct std::tuple_element<0ul, std::tuple<_El0, _El ...> >’
     struct tuple_element<0, tuple<_Head, _Tail...> >
            ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:248:12: error: redefinition of ‘struct std::tuple_size<std::tuple<_Args1 ...> >’
     struct tuple_size<tuple<_Elements...> >
            ^
In file included from /usr/include/c++/4.8.2/bits/stl_map.h:63:0,
                 from /usr/include/c++/4.8.2/map:61,
                 from 8k/include/Source.h:12,
                 from src/unit_tests_theo.cpp:2:
/usr/include/c++/4.8.2/tuple:737:12: error: previous definition of ‘struct std::tuple_size<std::tuple<_Args1 ...> >’
     struct tuple_size<tuple<_Elements...>>
            ^
In file included from /usr/include/c++/4.8.2/tr1/functional:39:0,
                 from /usr/local/include/google/dense_hash_map:106,
                 from sagarmatha/utils/include/multicast_receiver.h:11,
                 from include/transmitter/mcx_receiver.h:25,
                 from src/unit_tests_theo.cpp:7:
/usr/include/c++/4.8.2/tr1/tuple:254:49: error: definition of ‘std::tuple_size<std::tuple<_Args1 ...> >::value’ is not in namespace enclosing ‘std::tuple_size<std::tuple<_Args1 ...> >’ [-fpermissive]
     const int tuple_size<tuple<_Elements...> >::value;

map and dense_hash_map一起使用有关系吗?请帮忙?

【问题讨论】:

你试过-DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=0吗? @MarcoA。这是什么 ?我工作过。 【参考方案1】:

既然它解决了你的问题,我将其作为一个答案:设置 -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=0 以指示编译不要使用 tr1 元组,也不要使用它自己的元组实现。

【讨论】:

以上是关于GTEST 中 std::map 和 dense_hash_map 的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误

Gtest学习系列三:断言

gtest断言

std :: unordered_map向量下标超出范围

像数组一样访问 std::map 的 std::map

C++ std::map