नहीं मिल सकता है मैं गूगल टेस्ट v1.7Google परीक्षा उपयोगकर्ता प्रदान की समानता ऑपरेटर
मैं एक कस्टम 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);
}
है से एप्पल 6.0 बजना निम्न संदेश में ASSERT_EQ(vec, deq)
लाइन परिणाम:
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);
^
जबकि जीसीसी 4.7.2 सूचियों टेम्पलेट्स इसे करने की कोशिश और expected == actual
काम करने में विफल के सभी, अनदेखी मैंने प्रदान किया।
क्या मुझे समझ नहीं आता क्यों
ASSERT_EQ(vec, b)
प्रदान कीoperator ==
पाता है; औरvec == deq
संकलन; लेकिनASSERT_EQ(vec, deq)
नहीं है।
क्या कोई इस पर कुछ प्रकाश डाल सकता है? यह कुछ स्पष्ट रूप से स्पष्ट होना है, लेकिन मैं इसे नहीं देख सकता।
यदि यह मामला था, तो 'ASSERT_EQ (vec, b)' भी असफल नहीं होना चाहिए? –
ध्यान दें कि 'struct bar' को उसी नामस्थान पर परिभाषित किया गया है जिसमें 'ऑपरेटर ==' भी परिभाषित किया गया है।इसका अर्थ यह है कि जब संकलक 'ASSERT_EQ (vec, b) देखता है, तो' बीसी 'के कारण, वैश्विक नामस्थान में 'vec' के कारण, std नेमस्पेस में' ऑपरेटर ==' 'खोजने का प्रयास करेगा और परीक्षण में :: आंतरिक नामस्थान gtest के कारण। यह इसे मिलेगा और – Amadeus
संकलित करेगा, दूसरी तरफ, 'ASSERT_EQ (vec, deq)' के पास std namespace में परिभाषित तर्क हैं, इसलिए 'ऑपरेटर == 'उम्मीदवार नहीं है। आप 'ऑपरेटर ==' को परिभाषित करके yourselt को सत्यापित कर सकते हैं: 'नेमस्पेस std {टेम्पलेट < typename T> बूल ऑपरेटर == (कॉन्स std :: वेक्टर और v, const std :: deque और डी) {वापसी झूठी; }} '। लेकिन, फिर से, यह ** नहीं ** ** सी ++ मानकों द्वारा अनुमत है। आप विशेषज्ञ हो सकते हैं, लेकिन आप –
Amadeus