2011-01-09 3 views
7

ich spöttisch eine C++ Klasse, die zwei überladene Funktionen hat Google Mock und VS2010 mit:Google Mock: Mocked ladenen Funktionen create Warnung 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)); 
    // ... 
}; 

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' 

Irgendeine Idee warum?
Ist das korrektes Verhalten?
Wie kann ich das vermeiden?

+1

sicher, dass Sie die richtige Variante verwenden - MOCK_CONST_METHOD verwendet werden sollte, wenn 'A' Methode Sie überschrieben ist' const'. –

+0

@Billy ONeal - Die Methode selbst ist nicht const, nur ihre Parameter sind. Sollte ich MOCK_CONST_METHOD noch verwenden? – Jonathan

+0

Nein; In diesem Fall sollten Sie tun, was Sie tun :) –

Antwort

9

Wenn das neue Code ist, sollten Sie in Ordnung sein. Die C4373 warning sagt, dass alte Versionen von Visual Studio gegen den Standard verstoßen. Von der verlinkten Dokumentation:

Versionen des Compilers vor Visual C++ 2008 banden die Funktion die Methode in der Basisklasse, dann Ausgabe einer Warnmeldung. Nachfolgende Versionen des Compilers ignorieren das const oder volatile Qualifier, binden die Funktion an die Methode in der abgeleiteten Klasse , dann Warnung C4373 ausgeben. Dieses letztere Verhalten entspricht dem C++ Standard.

Dies wäre nur ein Problem, wenn Sie Code beschädigt hätten, der sich auf das falsche Verhalten von Visual Studio stützte.

+0

Ich hoffe, Sie haben Recht. Haben Sie einen Hinweis, dies zu bestätigen? Irgendwo Menschen, die dies diskutieren, ist in der Tat vorbei falsches Verhalten? Auch - wie kann ich dann diese Warnung abstellen? – Jonathan

+1

@ Jon, es ist in dem Link erklärt. Beachten Sie den letzten Teil: "Dieses letztere Verhalten entspricht dem C++ - Standard." –

+0

danke. Ich habe Folgendes verwendet, um die Warnung zu unterdrücken: http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c – Jonathan

3

Für mich (in VS 2010), die const auf primitiven Typ Parameter (die ich sehe Sie auch haben) verursacht dieses Verhalten. Wann immer solche in der Basisklassenfunktion existierten, die ich überschreiben wollte, konnte ich den Mock nicht so spezifizieren, dass diese Warnung nicht auftrat; Wenn nur die Konstantenwerte des Typs const/const verwendet werden, ist die Warnung nie aufgetreten.

Also scheint mir, dass die Warnung in diesem Fall tatsächlich ein Fehler im Compiler ist (da die Signaturen genau gleich sind).

0

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