0

有没有人在使用 Google Mock 和 wxWidgets 时遇到过运气?我有一个类 Foo ,其设置器在签名中对 wxString 进行 const 引用,如下所示:

class Foo {
public:
    Foo();
    virtual ~Foo();
    void setName(const wxString& name);
};

然后我继续像这样模拟 Foo:

class MockFoo : public Foo {
    MOCK_METHOD1(setName, void(const wxString& name));
};

我的其他模拟效果很好,但是它不喜欢 wxString 参数。当我编译时,我看到以下内容:

C:\gmock-1.6.0\gtest\include\gtest\internal\gtest-internal.h:890: error: conversion from `const wxUniChar' to `long long int' is ambiguous
C:\wxWidgets-2.9.0\include\wx\unichar.h:74: note: candidates are: wxUniChar::operator char() const
C:\wxWidgets-2.9.0\include\wx\unichar.h:75: note:                 wxUniChar::operator unsigned char() const
//more potential candidates from wxUniChar follow after that

要点是 Google Mock 无法确定调用哪个 operator() 函数,因为 wxUniChar 提供的 operator() 函数没有映射到 Google Mock 所期望的。我在“long long int”和“testing::internal::BiggestInt”转换中看到了这个错误。

4

2 回答 2

0

这必须是使用代理类wxUniCharRef的结果,作为结果类型(有关更多详细信息,请参见wxString 文档wxString::operator[]()的“粗心的陷阱”部分),但我不确定它究竟来自哪里这里似乎没有任何访问 wxString 字符的代码。第 890 行到底是什么?gtest-internal.h

此外,您说您正在使用对 wxString 的 const 引用,但您的代码没有。我认为这与您的问题并不真正相关,但是在描述和代码片段之间存在这种差异会令人困惑......

于 2013-05-14T18:20:38.673 回答
0

wxUniChar 头文件的以下添加似乎有效:

wxUniChar(long long int c) { m_value = c; }

operator long long int() const { return (long long int)m_value; }

wxUniChar& operator=(long long int c) { m_value = c; return *this; }

bool operator op(long long int c) const { return m_value op (value_type)c; }

wxUniCharRef& operator=(long long int c) { return *this = wxUniChar(c); }

operator long long int() const { return UniChar(); }

bool operator op(long long int c) const { return UniChar() op c; }

我将这些插入头文件的适当部分,编译错误就消失了。如果稍后我有时间,我将通过一些单元测试为 wxWidgets 开发一个补丁,如果这听起来是一个合理的解决方案。

于 2013-05-14T18:54:18.030 回答