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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top