Google Mock: fonctions surchargées moquaient avertissement C4373 créent
-
08-10-2019 - |
Question
Je suis moqueur une classe C ++ qui a 2 fonctions surchargées en utilisant Google Mock et 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));
// ...
};
Chaque fois que je compile je reçois le double avertissement suivant:
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'
Une idée pourquoi
Est-ce un comportement correct?
Comment puis-je éviter cela?
La solution
Dans ce nouveau code, vous devriez être bien. C4373 avertissement dit que les anciennes versions de Visual studio violé la norme. De la documentation liée:
Versions du compilateur avant Visual C ++ 2008 se lient à la fonction la méthode dans la classe de base, puis émettre un message d'avertissement. Subséquent versions du compilateur ignorer la const ou volatile qualificatif, se lient la fonction de la méthode de la dérivée classe, émettre ensuite avertissement C4373. Cette dernier comportement est conforme à la C ++ standard.
Ce ne serait un problème si vous aviez le code cassé qui reposait sur un comportement incorrect visuel de studio.
Autres conseils
Pour moi (VS 2010), en spécifiant le const
sur les paramètres de type primitif (que je vous voir aussi) a provoqué ce comportement. Chaque fois que tel existe dans la fonction de la classe de base que je voulais override, je ne pouvais pas spécifier la maquette d'une manière de sorte que cet avertissement ne se produit pas; quand seul l'avertissement ne se est produit ayant des paramètres de valeur de référence de type classe const / const.
Donc, pour moi, il semble que la mise en garde dans ce cas, est en fait une erreur dans le compilateur (comme les signatures sont exactement les mêmes).
approche suggérée:
#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));
// ...
};
Je sais que c'est une vieille question, mais depuis que je suis tombé sur moi-même maintenant, je voudrais partager ma solution (ou au moins l'explication):
Le problème est probable que votre déclaration a un paramètre const, qui sera ignoré par le compilateur. Il est le définition qui peuvent utiliser efficacement const pour le paramètre.
Il est également mentionné maintenant dans la section maquette faq google maintenant que, pour se débarrasser de l'avertissement, supprimer const
du paramètre dans la déclaration de fonction.
Dans mon cas, je l'ai trouvé encore difficile depuis la mise en œuvre de la fonction était d'une classe dans un en-tête basé sur un modèle où la déclaration et la définition se produisent sont à la fois fait ensemble. Solution à cette question est probablement désactiver l'avertissement en incluant l'en-tête de classe moqué.