Я использую 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 )
нет.
Может ли кто-нибудь пролить свет на это? Это должно быть что-то невероятно очевидное, но я не вижу этого.