Google Mock: Пересмотренные перегруженные функции создают предупреждение C4373 - PullRequest
9 голосов
/ 09 января 2011

Я шучу над классом C ++, который имеет 2 перегруженные функции, используя Google Mock и 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'

Есть идеи почему?
Это правильное поведение?
Как мне избежать этого?

Ответы [ 4 ]

9 голосов
/ 09 января 2011

Если это новый код, с вами все будет в порядке.Предупреждение C4373 говорит о том, что старые версии Visual Studio нарушали стандарт.Из связанной документации:

Версии компилятора до Visual C ++ 2008 связывают функцию с методом в базовом классе, а затем выдают предупреждающее сообщение.Последующие версии компилятора игнорируют константный или volatile квалификатор, связывают функцию с методом в производном классе, а затем выдают предупреждение C4373.Это последнее поведение соответствует стандарту C ++.

Это будет проблемой только в том случае, если вы испортили код, основанный на некорректном поведении Visual Studio.

4 голосов
/ 30 июля 2013

Для меня (в VS 2010) указание const на параметры типа примитива (которые, как я вижу, у вас также есть) вызвало такое поведение.Всякий раз, когда такое существовало в функции базового класса, которую я хотел переопределить, я не мог указать макет таким образом, чтобы это предупреждение не появлялось;когда есть только константное значение типа const / ссылочные параметры типа const, предупреждение никогда не происходит.

Так что мне кажется, что предупреждение в этом случае на самом деле является ошибкой в ​​компиляторе (поскольку сигнатуры в точности совпадают).

1 голос
/ 19 июля 2018

Я понимаю, что это старый вопрос, но так как я сам наткнулся на него сейчас, я хотел бы поделиться своим решением (или хотя бы объяснением):

Проблема, вероятно, в том, что ваше объявление 1004 * имеет параметр const, который будет игнорироваться компилятором. Именно определение может эффективно использовать const для параметра.

Это также упоминается теперь в google mock faq , теперь, чтобы убрать предупреждение, удалите const из параметра в объявлении функции.

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

1 голос
/ 20 июня 2014

Предлагаемый альтернативный подход:

#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));
    // ...
};
...