繁体   English   中英

河马与weak_ptr

[英]HippoMocks With weak_ptr

只是卡在尝试模拟以std::weak_ptr为参数的方法的代码的编译错误中。 HippoMocks有一个代码可以在调用With方法时进行比较,但不会被编译。 我将不胜感激任何帮助。

这是代码:

struct SomeClass {
   SomeClass(){};
   void someMethod(std::weak_ptr<int> d) {}
};

bool operator == (const std::weak_ptr<int> lhs, const std::weak_ptr<int> rhs) {
   return *(lhs.lock()) == *(rhs.lock());
}

BOOST_AUTO_TEST_CASE(test_weak_ptr)
{
   SomeClass obj;
   std::weak_ptr<int> data = std::make_shared<int>(new int(15));

   HippoMocks::MockRepository mocks;

   mocks.ExpectCall(&obj, SomeClass::someMethod).With(data);
}

MS VS 2010编译器不喜欢最后一行,并抱怨:

d:\hippomocks\hippomocks.h(398): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion)
      with
      [
          _Ty=int
      ]
      c:\program files (x86)\microsoft sdks\windows\v7.0a\include\guiddef.h(192): could be 'int HippoMocks::operator ==(const HippoMocks::GUID &,const HippoMocks::GUID &)'
      while trying to match the argument list '(const std::tr1::weak_ptr<_Ty>, const std::tr1::weak_ptr<_Ty>)'
      with
      [
          _Ty=int
      ]
      d:\hippomocks\hippomocks.h(397) : while compiling class template member function 'bool HippoMocks::comparer<T>::compare(const std::tr1::weak_ptr<_Ty>,const std::tr1::weak_ptr<_Ty>)'
      with
      [
          T=std::tr1::weak_ptr<int>,
          _Ty=int
      ]
      d:\hippomocks\hippomocks.h(650) : see reference to class template instantiation 'HippoMocks::comparer<T>' being compiled
      with
      [
          T=std::tr1::weak_ptr<int>
      ]
      d:\hippomocks\hippomocks.h(649) : while compiling class template member function 'bool HippoMocks::copy_tuple<A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP>::operator ==(const HippoMocks::ref_tuple<A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P> &)'
      with
      [
          A=std::tr1::weak_ptr<int>,
          B=HippoMocks::NullType,
          C=HippoMocks::NullType,
          D=HippoMocks::NullType,
          E=HippoMocks::NullType,
          F=HippoMocks::NullType,
          G=HippoMocks::NullType,
          H=HippoMocks::NullType,
          I=HippoMocks::NullType,
          J=HippoMocks::NullType,
          K=HippoMocks::NullType,
          L=HippoMocks::NullType,
          M=HippoMocks::NullType,
          N=HippoMocks::NullType,
          O=HippoMocks::NullType,
          P=HippoMocks::NullType,
          CA=const std::tr1::weak_ptr<int> &,
          CB=HippoMocks::NullType,
          CC=HippoMocks::NullType,
          CD=HippoMocks::NullType,
          CE=HippoMocks::NullType,
          CF=HippoMocks::NullType,
          CG=HippoMocks::NullType,
          CH=HippoMocks::NullType,
          CI=HippoMocks::NullType,
          CJ=HippoMocks::NullType,
          CK=HippoMocks::NullType,
          CL=HippoMocks::NullType,
          CM=HippoMocks::NullType,
          CN=HippoMocks::NullType,
          CO=HippoMocks::NullType,
          CP=HippoMocks::NullType
      ]
      d:\hippomocks\hippomocks.h(2985) : see reference to class template instantiation 'HippoMocks::copy_tuple<A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP>' being compiled
      with
      [
          A=std::tr1::weak_ptr<int>,
          B=HippoMocks::NullType,
          C=HippoMocks::NullType,
          D=HippoMocks::NullType,
          E=HippoMocks::NullType,
          F=HippoMocks::NullType,
          G=HippoMocks::NullType,
          H=HippoMocks::NullType,
          I=HippoMocks::NullType,
          J=HippoMocks::NullType,
          K=HippoMocks::NullType,
          L=HippoMocks::NullType,
          M=HippoMocks::NullType,
          N=HippoMocks::NullType,
          O=HippoMocks::NullType,
          P=HippoMocks::NullType,
          CA=const std::tr1::weak_ptr<int> &,
          CB=HippoMocks::NullType,
          CC=HippoMocks::NullType,
          CD=HippoMocks::NullType,
          CE=HippoMocks::NullType,
          CF=HippoMocks::NullType,
          CG=HippoMocks::NullType,
          CH=HippoMocks::NullType,
          CI=HippoMocks::NullType,
          CJ=HippoMocks::NullType,
          CK=HippoMocks::NullType,
          CL=HippoMocks::NullType,
          CM=HippoMocks::NullType,
          CN=HippoMocks::NullType,
          CO=HippoMocks::NullType,
          CP=HippoMocks::NullType
      ]
      d:\unittests\test.cpp(31) : see reference to function template instantiation 'HippoMocks::TCall<Y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P> &HippoMocks::TCall<Y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P>::With<std::tr1::weak_ptr<_Ty>>(const CA &)' being compiled
      with
      [
          Y=void,
          A=std::tr1::weak_ptr<int>,
          B=HippoMocks::NullType,
          C=HippoMocks::NullType,
          D=HippoMocks::NullType,
          E=HippoMocks::NullType,
          F=HippoMocks::NullType,
          G=HippoMocks::NullType,
          H=HippoMocks::NullType,
          I=HippoMocks::NullType,
          J=HippoMocks::NullType,
          K=HippoMocks::NullType,
          L=HippoMocks::NullType,
          M=HippoMocks::NullType,
          N=HippoMocks::NullType,
          O=HippoMocks::NullType,
          P=HippoMocks::NullType,
          _Ty=int,
          CA=std::tr1::weak_ptr<int>
      ]

这是依赖于参数的查找,使您不知所措。 它仅在参数的名称空间中查找,即“ HippoMocks”,“ std”和“ std”。 这意味着甚至不考虑您的全局运算符==。

解决方案:

  1. 在名称空间std中定义它。 非常难看,但是如果可以比较weak_ptr,那么可能应该在哪里完成。
  2. 在名称空间HippoMocks中定义它。 不太丑,但仍然很丑。
  3. 而不是使operator ==,而是使比较器显式实例化。 这至少不会失败,但是要优雅得多。
  4. 在C ++标准化委员会中游说以获取薄弱点运算符==。 最有可能会失败,并且需要很长时间。

我建议#3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM