Google Mock: las funciones sobrecargadas simuladas crean la advertencia C4373

Me estoy burlando de una clase C ++ que tiene 2 funciones sobrecargadas usando 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 compilo recibo la siguiente advertencia 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'

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

preguntado el 09 de enero de 11 a las 11:01

Asegúrese de que está usando la variante correcta; MOCK_CONST_METHOD debe usarse cuando AEl método que estás anulando es const. -

@Billy ONeal: el método en sí no es constante, solo sus parámetros lo son. ¿Debería seguir usando MOCK_CONST_METHOD? -

No; en ese caso deberías hacer lo que estás haciendo :) -

4 Respuestas

Si este es un código nuevo, debería estar bien. La Advertencia C4373 está diciendo que las versiones antiguas de Visual Studio violaron el estándar. De la documentación vinculada:

Las versiones del compilador anteriores a Visual C ++ 2008 vinculan la función al método en la clase base y luego emiten un mensaje de advertencia. Las versiones posteriores del compilador ignoran el calificador const o volátil, vinculan la función al método en la clase derivada y luego emiten la advertencia C4373. Este último comportamiento cumple con el estándar C ++.

Esto solo sería un problema si tuviera un código roto que se basara en el comportamiento incorrecto de Visual Studio.

Respondido el 21 de Septiembre de 17 a las 03:09

Espero que tengas razón. ¿Tiene una referencia para respaldar esto? ¿En algún lugar la gente que habla de esto es un comportamiento falso del pasado? Además, ¿cómo puedo silenciar esta advertencia específica? - Jonathan

@Jon, se explica en el enlace. Tenga en cuenta la última parte, "Este último comportamiento cumple con el estándar C ++". - Matthew Flaschen

Gracias. Usé lo siguiente para suprimir la advertencia: stackoverflow.com/questions/2541984/… - Jonathan

No entiendo, todos const están en los lugares correctos. Y de todos modos, la advertencia se ha disparado, ¿y por qué solo para algunos subconjuntos de métodos? - Yola

Para mí (en VS 2010), especificando el const en parámetros de tipo primitivo (que veo que también tiene) causó este comportamiento. Siempre que existiera tal cosa en la función de la clase base que quería anular, no podía especificar el simulacro de manera que no ocurriera esta advertencia; cuando solo se tienen parámetros de referencia const value / const de tipo de clase, la advertencia nunca ocurrió.

Entonces, para mí, parece que la advertencia en ese caso es en realidad un error en el compilador (ya que las firmas son exactamente las mismas).

Respondido 30 Jul 13, 18:07

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

Respondido el 20 de junio de 14 a las 15:06

Me doy cuenta de que esta es una pregunta antigua, pero como me encontré con ella ahora, me gustaría compartir mi solución (o al menos una explicación):

Es probable que el problema declaración tiene un parámetro const, que será ignorado por el compilador. Es el definición que puede utilizar efectivamente const para el parámetro.

También se menciona ahora en el preguntas frecuentes de Google Mock ahora que, para deshacerse de la advertencia, elimine const del parámetro en la declaración de función.

En mi caso, me resultó difícil ya que la implementación de la función era para una clase con plantilla dentro de un encabezado donde la declaración y la definición se realizan juntas. La solución a eso probablemente sea deshabilitar la advertencia al incluir el encabezado de la clase simulada.

contestado el 01 de mayo de 20 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.