Использование wxString с Google Mock

Кому-нибудь повезло с использованием Google Mock в сочетании с wxWidgets? У меня есть класс Foo с сеттерами, которые принимают константную ссылку на wxString в подписи следующим образом:

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

Затем я продолжаю издеваться над Фу так:

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() вызывать, поскольку функции operator(), предоставляемые wxUniChar, не соответствуют тому, что ожидает Google Mock. Я вижу эту ошибку для преобразований "long long int" и "testing::internal::BiggestInt".

2 ответа

Следующие добавления в заголовочный файл 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 с некоторыми юнит-тестами, если это звучит как разумное решение.

Это должно быть следствием использования прокси-класса, wxUniCharRef в качестве типа результата wxString::operator[]() (см. раздел "Ловушки для неосторожных" документации по wxString для получения более подробной информации), но я не уверен, откуда именно он берется, поскольку здесь, похоже, нет кода, обращающегося к символам wxString. Что именно находится на линии 890 gtest-internal.h?

Кроме того, вы говорите, что используете постоянную ссылку на wxString, но ваш код этого не делает. Я не думаю, что это действительно актуально для вашего вопроса, но сбивает с толку такое расхождение между описанием и фрагментами кода...

Другие вопросы по тегам