Tôi đang sử dụng Google thử nghiệm v1.7Google thử nghiệm không thể tìm thấy người dùng được cung cấp bình đẳng điều hành
tôi đã tạo ra một phong tục operator ==
mà ASSERT_EQ
không thể tìm thấy, nhưng có thể được tìm thấy nếu sử dụng trực tiếp. Dưới đây là đoạn code
#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);
}
Các ASSERT_EQ(vec, deq)
kết quả dòng trong thông báo sau từ Apple 6.0 kêu vang:
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);
^
khi gcc 4.7.2 liệt kê tất cả các mẫu nó đã cố gắng và thất bại trong việc thực hiện expected == actual
công việc, bỏ qua cái tôi đã cung cấp.
Những gì tôi không hiểu là tại sao
ASSERT_EQ(vec, b)
tìm được cung cấpoperator ==
; vàvec == deq
biên dịch; nhưngASSERT_EQ(vec, deq)
thì không.
Ai đó có thể làm sáng tỏ điều này? Nó phải là một cái gì đó rất rõ ràng, nhưng tôi không thể nhìn thấy nó.
Nếu trường hợp này xảy ra, không nên 'ASSERT_EQ (vec, b)' cũng không thành công? –
Lưu ý rằng 'struct bar' được định nghĩa tại cùng một không gian tên trong đó' toán tử == 'được định nghĩa quá.Điều đó có nghĩa là khi trình biên dịch thấy 'ASSERT_EQ (vec, b)', nó sẽ cố gắng tìm 'operator ==' trong không gian tên std, do 'vec', trong không gian tên chung, do' b' và trong thử nghiệm :: namespace nội bộ , do gtest. Nó sẽ tìm và biên dịch – Amadeus
Mặt khác, 'ASSERT_EQ (vec, deq)' có các đối số của nó được định nghĩa trong không gian tên std, do đó, 'operator ==' không phải là một ứng cử viên. Bạn có thể xác minh yourselt bằng cách định nghĩa 'operator ==' như: 'namespace std {template < typename T> toán tử bool == (const std :: vector & v, const std :: deque & d) {return false; }} '. Nhưng, một lần nữa, điều này là ** KHÔNG ** cho phép bởi các tiêu chuẩn C++. Bạn có thể chuyên, nhưng bạn không thể quá tải –
Amadeus