为什么我需要第二个参数?

Why do I need the second argument?

我有办法

class FooInterface {
    bool put(uint8_t* array, unsigned array_length);
}

测试需要验证 {1, 2, 3, 4, 5} 数组有 5 个元素被传递给 put 在我的 TEST_F() 中,我有以下代码。

uint8_t arr[5] = {1, 2, 3, 4, 5};  // Values for 'array' the out parameter

MockFoo foo;
FooInterface* fooI = &foo;

EXPECT_CALL(foo, put(_, 5))
    .With(Args<0,1>(ElementsAreArray(arr, 5)));

这似乎可行,但它让我发疯,因为我应该使用 Args<0> 而不是 Args<0,1>,因为我正在为第一个参数和数组大小匹配数组设置为 5。更改为:

EXPECT_CALL(BFO, put(_, 5))
    .With(Args<0>(ElementsAreArray(arr, 5)));  // Here is 'Args<0>'

产生这些错误:

/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:3114:34: error: no type named 'value_type' in 'std::tr1::tuple<const unsigned char *>'                                                                                                                                                                                                              
  typedef typename StlContainer::value_type Element;                                                                                                                                                                                                                                                                                                                         
          ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~                                                                                                                                                                                                                                                                                                                                  
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:3532:28: note: in instantiation of template class 'testing::internal::ElementsAreMatcherImpl<const std::tr1::tuple<const unsigned char *> &>' requested here                                                                                                                                        
    return MakeMatcher(new ElementsAreMatcherImpl<Container>(                                                                                                                                                                                                                                                                                                                
                           ^                                                                                                                                                                                                                                                                                                                                                 
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:555:12: note: in instantiation of function template specialization 'testing::internal::ElementsAreArrayMatcher<unsigned char>::operator Matcher<const std::tr1::tuple<const unsigned char *> &>' requested here                                                                                     
    return polymorphic_matcher_or_value;                                                                                                                                                                                                                                                                                                                                     
           ^                                                                                                                                                                                                                                                                                                                                                                 
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:531:12: note: in instantiation of member function 'testing::internal::MatcherCastImpl<const std::tr1::tuple<const unsigned char *> &, testing::internal::ElementsAreArrayMatcher<unsigned char> >::CastImpl' requested here                                                                         
    return CastImpl(                                                                                                                                                                                                                                                                                                                                                         
           ^                                                                                                                                                                                                                                                                                                                                                                 
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:628:45: note: in instantiation of member function 'testing::internal::MatcherCastImpl<const std::tr1::tuple<const unsigned char *> &, testing::internal::ElementsAreArrayMatcher<unsigned char> >::Cast' requested here                                                                             
    return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);                                                                                                                                                                                                                                                                                              
                                            ^                                                                                                                                                                                                                                                                                                                                
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-matchers.h:666:34: note: in instantiation of function template specialization 'testing::SafeMatcherCastImpl<const std::tr1::tuple<const unsigned char *> &>::Cast<testing::internal::ElementsAreArrayMatcher<unsigned char> >' requested here                                                                  
  return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);                                                                                                                                                                                                                                                                                                                  
                                 ^                                                                                                                                                                                                                                                                                                                                           
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-generated-matchers.h:221:24: note: in instantiation of function template specialization 'testing::SafeMatcherCast<const std::tr1::tuple<const unsigned char *> &, testing::internal::ElementsAreArrayMatcher<unsigned char> >' requested here                                                                  
      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}                                                                                                                                                                                                                                                                                               
                       ^                                                                                                                                                                                                                                                                                                                                                     
/home/sporty/ws-ccs/googletest/googlemock/include/gmock/gmock-generated-matchers.h:288:28: note: in instantiation of function template specialization 'testing::internal::ArgsMatcherImpl<const std::tr1::tuple<const unsigned char *, unsigned int> &, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1>::ArgsMatcherImpl<testing::internal::ElementsAreArrayMatcher<unsigned char> >' 
    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,                                                                                                                                                                                                                                                                                                
                           ^                                                                                                                                                                                                                                                                                                                                                 
/home/sporty/ws-ccs/hw_1_5/miwt-os/coap/unittest/cbor_encoder_test.cpp:176:15: note: in instantiation of function template specialization 'testing::internal::ArgsMatcher<testing::internal::ElementsAreArrayMatcher<unsigned char>, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1>::operator Matcher<const std::tr1::tuple<const unsigned char *, unsigned int> &>' requested here  
        .With(Args<0>(ElementsAreArray(arr, 5)));
              ^  

指针不是数组;它只是内存中某个位置的地址。系统无法知道您为数组保留了多长时间的内存。第二个参数专门用于此目的。您在创建它时知道它有多长,因此您必须传递该信息。

但是,除非您被禁止这样做,否则我建议您花时间学习如何使用模板来处理您的数组和数组类型结构。 std::array 非常好,有各种花哨的功能供您使用。最重要的是,它可以解决维护阵列的所有麻烦。