我根据以下示例使用类似的代码:

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);
  }

07-27 13:35