Макет Google:Высмеянные перегруженные функции создают предупреждение C4373

StackOverflow https://stackoverflow.com/questions/4638903

Вопрос

Я издеваюсь над классом 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 от параметра в объявлении функции.

В моем случае я нашел его еще тяжело, поскольку реализация функции была для классанного класса внутри заголовка, где декларация и определение произойдут вместе. Решением, вероятно, для отключения предупреждения при включении издеватого класса «заголовок класса».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top