2011-01-09 2 views
7

Я насмешливо на C++ класс, который имеет 2 перегруженных функций с помощью Google Mock и VS2010:Google Mock: Передразнивало перегруженные функции создают предупреждение C4373

#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' 

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

+1

Убедитесь, что вы используете правильный вариант - MOCK_CONST_METHOD следует использовать, когда 'метод Ā' есть вы переопределение является' const'. –

+0

@Billy ONeal - сам метод не const, только его параметры. Должен ли я использовать MOCK_CONST_METHOD? – Jonathan

+0

Нет; в этом случае вы должны делать то, что делаете :) –

ответ

9

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

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

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

+0

Надеюсь, вы правы. У вас есть ссылка на это? Где-то люди, обсуждающие это, действительно прошли мимо ложного поведения? Также - как тогда я могу отключить это конкретное предупреждение? – Jonathan

+1

@Jon, это объясняется в ссылке. Обратите внимание на последнюю часть: «Это последнее поведение соответствует стандарту C++». –

+0

спасибо. Я использовал следующее для подавления предупреждения: http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c – Jonathan

3

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

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

0

Отдается альтернативный подход:

#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)); 
    // ... 
}; 
Смежные вопросы