我根据以下示例使用类似的代码:
class FOO
{
private:
operator int() const;
};
class BARMOCK
{
public:
MOCK_METHOD1(Bar, void(const FOO& foo));
};
不幸的是,编译器会生成以下错误消息:
gtest/internal/gtest-internal.h(892): error C2248: 'FOO::operator int': cannot access private member declared in class 'FOO'
来自gtest-internal本身:
static const bool value = sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
有没有使其可行的方法,或者它是Google模拟框架的已知限制?
当然,有一些方法可以解决该问题,例如:
class BARMOCK
{
public:
MOCK_METHOD1(BarMock, void());
void Bar(const FOO& foo) { BarMock(); }
};
但这只是一种解决方法,而不是真正的解决方案。有人对这个有了解吗?谢谢。
最佳答案
问题是googlemock要打印您的FOO值。它按照以下算法运行:
如果已定义函数PrintTo(FOO const&, std::ostream*)
,则使用它
否则,如果可以通过经典C ++方式(使用operator <<
)进行打印,则使用它
否则,将打印代表该FOO对象的字节
在您的情况下,C ++编译器(而非googlemock)被私有int强制转换运算符“欺骗”-int
是可打印的-因此std::cout << FOO{}
是可打印的-但是-编译器会注意到此转换是私有的...
所以:
要么定义PrintTo(FOO const&, std::ostream*)
或定义std::ostream& operator << (std::ostream&, const FOO&)
-该运算符可能被定义为好友函数,
喜欢:
class FOO {
friend std::ostream& operator << (std::ostream& os, const FOO& foo)
{
return os << static_cast<int>(foo);
}