Использование 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, но ваш код этого не делает. Я не думаю, что это действительно актуально для вашего вопроса, но сбивает с толку такое расхождение между описанием и фрагментами кода...