2011-01-09 10 views
7

sto beffarda una classe C++ che ha 2 funzioni sovraccaricate con Google Mock e VS2010:Google Mock: funzioni sovraccaricate deriso creano avviso 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)); 
    // ... 
}; 

Ogni volta che compilo ottengo il seguente avvertimento 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' 

Qualche idea del perché?
È corretto questo comportamento?
Come posso evitare questo?

+1

assicurarsi che si sta utilizzando la variante destra - MOCK_CONST_METHOD deve essere utilizzato quando 'metodo A' che stai sovrascrivendo è' const'. –

+0

@Billy ONeal - Il metodo stesso non è const, solo i suoi parametri sono. Devo usare ancora MOCK_CONST_METHOD? – Jonathan

+0

No; in tal caso dovresti fare quello che stai facendo :) –

risposta

9

Se questo è un nuovo codice, si dovrebbe andare bene. Il C4373 warning sta dicendo che le vecchie versioni di Visual Studio violavano lo standard. Dalla documentazione collegata:

versioni del compilatore prima Visual C++ 2008 legano la funzione di il metodo nella classe base, quindi emettere un messaggio di avviso. Le versioni successive del compilatore ignorano il qualificatore const o volatile , associare la funzione al metodo nella classe derivata , quindi emettere l'avviso C4373. Questo ultimo comportamento di è conforme allo standard C++ .

Questo sarebbe solo un problema se si fosse verificato un codice non corretto che si basava sul comportamento scorretto di Visual Studio.

+0

Spero davvero che tu abbia ragione. Hai un riferimento per confermare? Da qualche parte la gente che discute di questo è davvero un comportamento falso passato? Inoltre, come posso disattivare l'avviso specifico? – Jonathan

+1

@Jon, è spiegato nel link. Nota l'ultima parte, "Quest'ultimo comportamento è conforme allo standard C++." –

+0

grazie. Ho usato quanto segue per sopprimere l'avviso: http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c – Jonathan

3

Per me (in VS 2010), specificare il parametro const su parametri di tipo primitivo (che vedo anche tu) ha causato questo comportamento. Ogni volta che esisteva nella funzione della classe base che volevo sovrascrivere, non potevo specificare il mock in un modo tale che questo avvertimento non si verificasse; quando si hanno solo parametri di tipo const value/const reference di classe, l'avvertimento non si è mai verificato.

Quindi per me sembra che l'avviso in questo caso sia in realtà un errore nel compilatore (poiché le firme sono esattamente le stesse).

0

consigliata approccio alternativo:

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