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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top