为什么我不能将 gtest ValuesIn 生成器与 std::map 一起使用?
Why can't I use the gtest ValuesIn generator with a std::map?
我正试图用gtest以以下方式对地图的元素运行一些测试:
typedef std::map< std::string, std::vector< std::string > > maptype;
static maptype generateMapOfElements() {...}
class MyTest : public TestWithParam< maptype::value_type > {
...
}
TEST_P(MyTest , my_first_test) { .. }
INSTANTIATE_TEST_CASE_P(test_prefix,
MyTest,
ValuesIn( generateMapOfElements() ) ); // <- problem
问题似乎是实例化pair::swap
会产生问题,因为映射的密钥是常量字符串(下面的完整日志(
1>C:Program Files (x86)Microsoft Visual Studio 11.0VCincludeutility(48): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludexstring(912): could be 'std::basic_string<_Elem,_Traits,_Alloc> &std::basic_string<_Elem,_Traits,_Alloc>::operator =(std::basic_string<_Elem,_Traits,_Alloc> &&) throw()'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludexstring(969): or 'std::basic_string<_Elem,_Traits,_Alloc> &std::basic_string<_Elem,_Traits,_Alloc>::operator =(const std::basic_string<_Elem,_Traits,_Alloc> &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludexstring(987): or 'std::basic_string<_Elem,_Traits,_Alloc> &std::basic_string<_Elem,_Traits,_Alloc>::operator =(const _Elem *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludexstring(992): or 'std::basic_string<_Elem,_Traits,_Alloc> &std::basic_string<_Elem,_Traits,_Alloc>::operator =(_Elem)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> while trying to match the argument list '(const std::string, const std::basic_string<_Elem,_Traits,_Alloc>)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludeutility(56) : see reference to function template instantiation 'void std::swap<_Ty>(_Ty &,_Ty &)' being compiled
1> with
1> [
1> _Ty=std::string
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludeutility(107) : see reference to function template instantiation 'void std::_Swap_adl<_Ty1>(_Ty &,_Ty &)' being compiled
1> with
1> [
1> _Ty1=std::string,
1> _Ty=std::string
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludeutility(104) : while compiling class template member function 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)'
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=std::vector<testing::internal::string>
1> ]
1> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludeutility(211) : see reference to function template instantiation 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)' being compiled
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=std::vector<testing::internal::string>
1> ]
1> C:dirmy_test.cpp(251) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=std::vector<testing::internal::string>
1> ]
ValuesIn
函数返回一个生成器,该生成器保留值的副本,该副本存储在vector
中。(为什么要存储副本?因为通常情况下,它不能依赖原始值源在测试的整个生命周期内保持有效。(vector
的要求之一是其元素类型必须是可赋值的(C++03,§23.1/3(。然而,正如您已经注意到的,map::value_type
就是pair<const Key, T>
。const键类型阻止了该类型的可赋值性。
您可以考虑返回一个vector<pair<string, vector<string>>>
,而不是生成器函数中的map<string, vector<string>>
。
相关文章:
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏