Frage

Ich bin spöttisch eine C ++ Klasse, die zwei überladene Funktionen hat mit Google Mock und 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));
    // ...
};

Jedes Mal, wenn ich kompilieren bekomme ich die folgende Warnung zweimal:

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'

Jede Idee, warum?
Ist das richtige Verhalten?
Wie kann ich das vermeiden?

War es hilfreich?

Lösung

Wenn diese neue Code ist, sollten Sie in Ordnung sein. Die C4373 Warnung sagt, dass alte Versionen von Visual Studio des Standard verletzt. Aus der verknüpften Dokumentation:

Versionen des Compilers vor Visual C ++ 2008 binden die Funktion Das Verfahren in der Basisklasse, dann Ausgabe einer Warnmeldung. Anschließend Versionen des Compilers ignorieren die const oder volatile Qualifier binden die Funktion auf das Verfahren in der abgeleiteten Klasse, gibt dann C4373 Warnung. Dies letztere Verhalten erfüllt mit dem C ++ Standard.

Dies wäre nur dann ein Problem, wenn Sie Code gebrochen hatten, die auf Visual Studio falsches Verhalten verlassen.

Andere Tipps

Für mich (in VS 2010) unter Angabe des const auf primitive Art Parameter (was ich sehe, Sie haben auch) verursacht dieses Verhalten. Immer dann, wenn eine solche in der Basisklasse Funktion existiere ich außer Kraft setzen wollte, konnte ich nicht die Mock in einer Art und Weise festlegen, so dass diese Warnung nicht auftreten; wenn nur Klassentyp const Wert / konst Referenzparameter, die Warnung nie aufgetreten.

mir So scheint es, wie die Warnung in diesem Fall tatsächlich ein Fehler im Compiler (wie die Signaturen sind genau die gleichen).

Empfohlene alternativer Ansatz:

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

Ich weiß, dies ist eine alte Frage, aber da ich auf sie mich jetzt stolperte, würde Ich mag meine Lösung teilen (oder zumindest Erklärung):

Das Problem ist wahrscheinlich, dass Ihre Erklärung einen const Parameter hat, der vom Compiler ignoriert. Es ist die Definition , die effektiv const für die Parameter verwenden können.

Es ist auch jetzt in der google Mock faq jetzt, dass, um loszuwerden die Warnung, Entfernen const aus dem Parameter in der Funktionsdeklaration.

In meinem Fall fand ich es immer noch schwer, da die Funktion Implementierung für eine Templat-Klasse in einem Header war, wo Deklaration und Definition geschehen sind beide zusammen getan. Lösung das ist wahrscheinlich die Warnung, wenn einschließlich der verspottet Klasse Header zu deaktivieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top