Google Mock: funzioni sovraccaricate deriso creano avviso C4373
-
08-10-2019 - |
Domanda
Sono beffardo una classe C ++ che ha 2 funzioni sovraccaricate utilizzando Google Mock e 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));
// ...
};
Ogni volta che ricevo compilare il seguente avviso due volte:
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'
Qualsiasi idea del perché?
È questo comportamento corretto?
Come posso evitare questo?
Soluzione
Se questo è il nuovo codice, si dovrebbe andare bene. Il C4373 avvertimento sta dicendo che le vecchie versioni di Visual Studio violato lo standard. Dalla documentazione collegata:
Le versioni del compilatore prima Visual C ++ 2008 legano la funzione di il metodo nella classe base, quindi emettere un messaggio di avviso. successivo versioni del compilatore ignorano il const o qualificatore volatile, legano il funzione per il metodo nella derivato di classe, quindi Invia avviso C4373. Questo conforme comportamento quest'ultima con il C ++ standard.
Questo sarebbe solo un problema se si fosse rotto il codice che si basava sul comportamento scorretto di Visual Studio.
Altri suggerimenti
Per me (in VS 2010), specificando il const
su parametri di tipo primitivo (che vi si veda anche avere) ha causato questo comportamento. Ogni volta che tale esisteva nella funzione classe di base che volevo esclusione, non ho potuto specificare il finto in modo tale che questo avviso non si è verificato; quando solo avendo tipo di classe valore const / parametri di riferimento const, l'avvertimento non si è verificato.
Quindi, per me sembra che l'avviso in questo caso è in realtà un errore nel compilatore (come le firme sono esattamente gli stessi).
approccio alternativo consigliato:
#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));
// ...
};
mi rendo conto che è una vecchia questione, ma da quando mi sono imbattuto su io stesso ora, vorrei condividere la mia soluzione (o almeno una spiegazione):
Il problema è probabile che la vostra dichiarazione di ha un parametro const, che verrà ignorato dal compilatore. E 'il definizione che possono utilizzare in modo efficace const per il parametro.
E 'citato anche ora nel google finto faq ora che, al fine di sbarazzarsi di l'avvertimento, const
rimuovere dal parametro nella dichiarazione di funzione.
Nel mio caso ho trovato ancora difficile in quanto l'attuazione funzione era per una classe su modelli all'interno di un colpo di testa in cui la dichiarazione e la definizione accadono sono entrambi fatto insieme. Soluzione a questo è probabilmente quello di disattivare l'avviso quando si include l'intestazione deriso class'.