Pregunta

Me estoy burlando de una clase de C ++ que tiene 2 funciones sobrecargadas utilizando Google Mock y 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));
    // ...
};

Cada vez que compilar me sale el siguiente aviso dos veces:

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'

Cualquier idea de por qué?
¿Es este comportamiento correcto?
¿Cómo puedo evitar esto?

¿Fue útil?

Solución

Si esto es nuevo código, que debe estar bien. El C4373 advertencia está diciendo que las versiones anteriores de Visual Studio violan la norma. De la documentación vinculada:

Las versiones del compilador que antes Visual C ++ 2008 se unen a la función el método en la clase base, entonces emitir un mensaje de advertencia. Subsecuente versiones del compilador ignoran el const o calificador volátil, se unen la función para el método en el derivado clase, entonces emitir advertencia C4373. Esta Cumple comportamiento últimas con el C ++ estándar.

Esto sólo sería un problema si se hubiera roto el código que se basó en el comportamiento incorrecto de Visual Studio.

Otros consejos

Para mí (en VS 2010), especificando el const en parámetros de tipo primitivo (que yo te vea también tienen) causó este comportamiento. Con motivo de dicha existido en la función de la clase base que quería anulación, no podía especificar el simulacro de una manera para que esta advertencia no se produjo; cuando sólo el tipo de clase que tiene valor const / parámetros de referencia constante, la advertencia nunca se produjo.

Así que a mí me parece que la advertencia en caso de que en realidad es un error en el compilador (como las firmas son exactamente los mismos).

enfoque alternativo sugerido:

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

Me di cuenta que es una vieja pregunta, pero desde que me encontré con que yo ahora, me gustaría compartir mi solución (o al menos la explicación):

Es probable que su declaración tiene un parámetro const, que será ignorado por el compilador El problema. Es el Definición que puede utilizar con eficacia const para el parámetro.

También se menciona ahora en el google simulacro FAQ ahora que, con el fin de deshacerse de la advertencia, const de eliminación del parámetro en la declaración de la función.

En mi caso me pareció que era todavía difícil ya que la implementación de la función era para una clase de plantilla dentro de una cabecera en la declaración y definición suceden son a la vez hecho juntos. Solución a esto es probablemente para desactivar la alarma cuando se incluye la cabecera de la clase burlado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top