HippoMocks с слабым_птр

Просто застрял с ошибкой компиляции кода, пытаясь смоделировать метод, принимающий 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 Compiler не любит последнюю строку и жалуется:

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>
]

0

Решение

Это аргумент-зависимый поиск, который вас обманывает. Он просматривает только пространства имен аргументов, а именно «HippoMocks», «std» и «std». Это означает, что он даже не будет рассматривать ваш глобальный оператор ==.

Решения:

  1. Определите это в пространстве имен std. Очень некрасиво, но, вероятно, где это должно было быть сделано, если можно сравнивать weak_ptr.
  2. Определите его в пространстве имен HippoMocks. Менее уродливый, но все еще довольно уродливый.
  3. Вместо того чтобы делать оператор ==, сделайте компаратор явным образом. Это не подведет, по крайней мере, но это гораздо менее элегантно.
  4. Лобби в комитете по стандартизации C ++, чтобы получить оператора == на слабых_птр. Скорее всего, потерпит неудачу и займет очень много времени.

Я предлагаю № 3.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]