我正在使用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::vectorstd::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/

    10-13 08:31