Макет Google:Высмеянные перегруженные функции создают предупреждение C4373
-
08-10-2019 - |
Вопрос
Я издеваюсь над классом C ++, который имеет 2 перегруженные функции, используя Макет Google и VS2010:
#include "stdafx.h"
#include "gmock/gmock.h"
#include "A.h"
class MockA : public A
{
public:
// ...
MOCK_METHOD3(myFunc, void(const int id, const int errorCode, const CString errorMsg));
MOCK_METHOD1(myFunc, void(const CString errorMsg));
// ...
};
Каждый раз, когда я компилирую, я дважды получаю следующее предупреждение:
1>c:\dev\my_project\tests\mocka.h(83): warning C4373: 'MockA::myFunc': virtual function overrides 'A::myFunc', previous versions of the compiler did not override when parameters only differed by const/volatile qualifiers
1> c:\dev\my_project\my_project\include\a.h(107) : see declaration of 'A::myFunc'
Есть идеи, почему?
Является ли это правильным поведением?
Как я могу избежать этого?
Решение
Если это новый код, вы должны быть в порядке. То C4373 Предупреждение Говорят, что старые версии визуальной студии нарушили стандарт. Из связанной документации:
Версии компилятора до Visual C ++ 2008 связывают функцию к методу в базовом классе, затем выпустите предупреждающее сообщение. Последующие версии компилятора игнорируют Const или Wolitile Qualifier, связывают функцию к способу в полученном классе, затем выдают предупреждение C4373. Это последнее поведение соответствует стандарту C ++.
Это будет только проблема, если у вас был сломанный код, который полагался на неправильное поведение Visual Studio.
Другие советы
Для меня (в VS 2010), указав const
параметры примитивного типа (которые, я вижу, у вас тоже есть) вызвали такое поведение.Всякий раз, когда такое существовало в функции базового класса, которую я хотел переопределить, я не мог указать макет таким образом, чтобы это предупреждение не возникало;при наличии только параметров типа класса const value / const reference предупреждение так и не появилось.
Поэтому мне кажется, что предупреждение в этом случае на самом деле является ошибкой в компиляторе (поскольку сигнатуры точно такие же).
Предлагаемый альтернативный подход:
#include "stdafx.h"
#include "gmock/gmock.h"
#include "A.h"
class MockA : public A
{
public:
// ...
void myFunc(const int id, const int errorCode, const CString errorMsg) {
mocked_myFunc3(id, errorCode, errorMsg);
}
void myFunc(const CString errorMsg) {
mocked_myFunc1(errorMsg);
}
MOCK_METHOD3(mocked_myFunc_3, void(const int id, const int errorCode, const CString errorMsg));
MOCK_METHOD1(mocked_myFunc_1, void(const CString errorMsg));
// ...
};
Я понимаю, что это старый вопрос, но так как я сам наткнулся на него, я бы хотел поделиться своим решением (или, по крайней мере, объяснением):
Проблема, вероятно, что ваша декларация имеет параметр const, который будет игнорироваться компилятором. Это определение Это может эффективно использовать const для параметра.
Это также упоминается сейчас в FAQ FAQ Google Mock Теперь, когда, чтобы избавиться от предупреждения, удалить const
от параметра в объявлении функции.
В моем случае я нашел его еще тяжело, поскольку реализация функции была для классанного класса внутри заголовка, где декларация и определение произойдут вместе. Решением, вероятно, для отключения предупреждения при включении издеватого класса «заголовок класса».