我正在使用Google Test v1.7
我创建了一个自定义的operator ==
,它无法找到ASSERT_EQ
,但是如果直接使用它就可以找到。这是代码
#include <vector>
#include <deque>
#include "gtest/gtest.h"
template< typename T> struct bar { T b; };
template< typename T>
bool operator == ( const std::vector<T>& v, const bar<T>& b ) { return false; }
template< typename T>
bool operator==( const std::vector<T>& v , const std::deque<T>& d) { return false; }
TEST( A, B ) {
std::vector<char> vec;
std::deque<char> deq;
bar<char> b;
// compiles
ASSERT_EQ( vec, b );
// compiles
vec == deq;
// doesn't compile
ASSERT_EQ( vec, deq );
}
ASSERT_EQ( vec, deq )
行导致来自Apple 6.0 clang 的以下消息:test/gtest.h:18861:16: error: invalid operands to binary expression ('const std::__1::vector<char, std::__1::allocator<char> >' and 'const
std::__1::deque<char, std::__1::allocator<char> >')
if (expected == actual) {
~~~~~~~~ ^ ~~~~~~
../x86_64-linux_debian-7/tests/gtest/gtest.h:18897:12: note: in instantiation of function template specialization 'testing::internal::CmpHelperEQ<std::__1::vector<char,
std::__1::allocator<char> >, std::__1::deque<char, std::__1::allocator<char> > >' requested here
return CmpHelperEQ(expected_expression, actual_expression, expected,
^
tst.cc:27:5: note: in instantiation of function template specialization 'testing::internal::EqHelper<false>::Compare<std::__1::vector<char, std::__1::allocator<char> >,
std::__1::deque<char, std::__1::allocator<char> > >' requested here
ASSERT_EQ( vec, deq );
^
而gcc 4.7.2列出了它尝试使
expected == actual
工作失败的所有模板,而忽略了我提供的模板。我不明白的是为什么
ASSERT_EQ( vec, b )
查找提供的operator ==
;和vec == deq
编译;但是ASSERT_EQ( vec, deq )
没有。 有人可以照耀一下吗?这一定是显而易见的,但我看不到。
最佳答案
您的问题归因于ADL(依赖于参数的查找)。如您所知,std::vector
和std::deque
是在std
命名空间中定义的,但是您正在全局命名空间中定义operator==
,并且ADL无法找到此函数。
要解决您的问题,必须在operator==
命名空间内部的容器的相同命名空间中定义std
。问题是您被禁止来执行此操作。通过这种方式,我建议您仅更改一些方法。为什么不尝试这样的事情:
template< typename T>
bool equal( const std::vector<T>& v , const std::deque<T>& d) { return false; }
TEST( A, B ) {
std::vector<char> vec;
std::deque<char> deq;
ASSERT_TRUE( equal(vec, deq) );
}
关于c++ - Google测试找不到用户提供的相等运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39049803/