2012-10-05 46 views
3

我不能编译的最后一行以下两个代码的boost ::变种对象:比较使用EXPECT_EQ从谷歌测试

typedef boost::variant<std::vector<int8_t>, std::vector<std::string>> Container; 

std::vector<std::string> v1; 
v1.push_back("sd"); 
Container c1; 
c1 = v1; 

std::vector<int8_t> v2; 
v2.push_back(1); 
v2.push_back(2); 
Container c2; 
c2 = v2; 

EXPECT_EQ(c1,c2); 

但是,如果我用这条线替换它,它的工作原理:

EXPECT_EQ(c1==c2,true); 

EXPECT_EQ是Google Test的一项功能。

这里有什么问题?

在VS2010编译器误差如下:

1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(338) : see reference to function template instantiation 'void testing_internal::DefaultPrintNonContainerTo<T>(const T &,std::ostream *)' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(376) : see reference to function template instantiation 'void testing::internal::DefaultPrintTo<T>(testing::internal::IsNotContainer,testing::internal::false_type,const T &,std::ostream *)' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(600) : see reference to function template instantiation 'void testing::internal::PrintTo<T>(const T &,std::ostream *)' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(591) : while compiling class template member function 'void testing::internal::UniversalPrinter<T>::Print(const T &,std::ostream *)' 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(697) : see reference to class template instantiation 'testing::internal::UniversalPrinter<T>' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(678) : see reference to function template instantiation 'void testing::internal::UniversalPrint<T>(const T &,std::ostream *)' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest-printers.h(790) : see reference to function template instantiation 'void testing::internal::UniversalTersePrint<T>(const T &,std::ostream *)' being compiled 
1>   with 
1>   [ 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest.h(1301) : see reference to function template instantiation 'std::string testing::PrintToString<T1>(const T &)' being compiled 
1>   with 
1>   [ 
1>    T1=Com::ObjRepWrap::Container, 
1>    T=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest.h(1326) : see reference to function template instantiation 'testing::internal::String testing::internal::FormatForComparisonFailureMessage<T1,T2>(const T1 &,const T2 &)' being compiled 
1>   with 
1>   [ 
1>    T1=Com::ObjRepWrap::Container, 
1>    T2=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\gtest-1.6.0\include\gtest\gtest.h(1353) : see reference to function template instantiation 'testing::AssertionResult testing::internal::CmpHelperEQ<T1,T2>(const char *,const char *,const T1 &,const T2 &)' being compiled 
1>   with 
1>   [ 
1>    T1=Com::ObjRepWrap::Container, 
1>    T2=Com::ObjRepWrap::Container 
1>   ] 
1>   c:\visual studio 2010\projects\db\xxx\main.cpp(127) : see reference to function template instantiation 'testing::AssertionResult testing::internal::EqHelper<lhs_is_null_literal>::Compare<Com::ObjRepWrap::Container,Com::ObjRepWrap::Container>(const char *,const char *,const T1 &,const T2 &)' being compiled 
1>   with 
1>   [ 
1>    lhs_is_null_literal=false, 
1>    T1=Com::ObjRepWrap::Container, 
1>    T2=Com::ObjRepWrap::Container 
1>   ] 
1>c:\boost_1_49_0\boost\variant\detail\variant_io.hpp(64): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const T1' (or there is no acceptable conversion) 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(726): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(764): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(811): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(937): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(944): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(951): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(958): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(968): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,T>(std::basic_ostream<_Elem,_Traits> &&,_Ty)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    T=T1, 
1>    _Ty=T1 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(1085): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\boost_1_49_0\boost\blank.hpp(93): or  'std::basic_ostream<_Elem,_Traits> &boost::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const boost::blank &)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(186): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(192): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(199): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(206): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(226): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(260): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(280): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(305): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(325): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(345): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(366): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(386): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(407): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(427): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(447): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(467): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(487): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, const T1)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\boost_1_49_0\boost\variant\variant.hpp(858) : see reference to function template instantiation 'void boost::detail::variant::printer<OStream>::operator()<const T>(const T &) const' being compiled 
1>   with 
1>   [ 
1>    OStream=std::basic_ostream<char,std::char_traits<char>>, 
1>    T=T1 
1>   ] 
1>   c:\boost_1_49_0\boost\variant\detail\visitation_impl.hpp(145) : see reference to function template instantiation 'void boost::detail::variant::invoke_visitor<Visitor>::internal_visit<const T>(T &,int)' being compiled 
1>   with 
1>   [ 
1>    Visitor=boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>, 
1>    T=T1 
1>   ] 
1>   c:\boost_1_49_0\boost\variant\detail\visitation_impl.hpp(173) : see reference to function template instantiation 'void boost::detail::variant::visitation_impl_invoke_impl<Visitor,VoidPtrCV,T>(int,Visitor &,VoidPtrCV,T *,boost::mpl::false_)' being compiled 
1>   with 
1>   [ 
1>    Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>, 
1>    VoidPtrCV=const void *, 
1>    T=T1 
1>   ] 
1>   c:\boost_1_49_0\boost\variant\detail\visitation_impl.hpp(256) : see reference to function template instantiation 'void boost::detail::variant::visitation_impl_invoke<Visitor,VoidPtrCV,T1,NoBackupFlag>(int,Visitor &,VoidPtrCV,T *,NoBackupFlag,int)' being compiled 
1>   with 
1>   [ 
1>    Visitor=boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char,std::char_traits<char>>>>, 
1>    VoidPtrCV=const void *, 
1>    NoBackupFlag=boost::variant<std::vector<testing::internal::string>,std::vector<int8_t>>::has_fallback_type_, 
1>    T=T1 
1>   ] 

回答

2
EXPECT_EQ(c1==c2); 

这失败,因为它需要两个参数(见this)。

你可以使用EXPECT_TRUE(condition);它是否适合你的需要:

EXPECT_TRUE(c1==c2); 

编辑:

this

我们曾经需要的参数支持< <运营商的流到一个ostream,但它不再是必需的,因为v1.6.0(如果支持< <,它将会在断言失败时调用它来打印参数;否则Google测试会尝试以最好的方式打印它们。

因此,除非您使用的版本不是1.6.0或更高,否则您需要定义operator<<

+2

对不起,应该读取EXPECT_EQ(c1,c2);我已经解决了这个问题。 – Baz

+0

为什么EXPECT_TRUE(c1 == c2);工作但不是EXPECT_EQ(c1,c2); – Baz

+0

谢谢,很好的回答! – Baz