質問

私は2つの過負荷機能を使用しているC ++クラスをock笑しています グーグルモック および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));
    // ...
};

コンパイルするたびに、次の警告が2回表示されます。

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'

理由は何ですか?
これは正しい動作ですか?
どうすればこれを避けることができますか?

役に立ちましたか?

解決

これが新しいコードの場合、大丈夫です。 C4373警告 Visual Studioの古いバージョンが基準に違反したと言っています。リンクされたドキュメントから:

Visual C ++ 2008の前にコンパイラのバージョンは、関数をベースクラスのメソッドに結合し、警告メッセージを発行します。コンパイラの後続のバージョンは、constまたは揮発性の予選を無視し、派生クラスのメソッドに関数を結合し、警告C4373を発行します。この後者の動作は、C ++標準に準拠しています。

これは、Visual Studioの誤った動作に依存しているコードを壊した場合にのみ問題になります。

他のヒント

私のために(2010年vs)、指定 const プリミティブタイプのパラメーター(私もあなたが見ている)では、この動作を引き起こします。私がオーバーライドしたい基本クラスの関数にそのようなものが存在するときはいつでも、この警告が発生しないように模擬を指定することができませんでした。クラスタイプのconst値 / const参照パラメーターのみを持っている場合、警告は発生しませんでした。

したがって、私にとっては、その場合の警告は実際にはコンパイラーの間違いであるように思われます(署名はまったく同じです)。

提案された代替アプローチ:

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

私はこれが古い質問であることに気づきましたが、私は今自分でつまずいたので、私の解決策(または少なくとも説明)を共有したいと思います:

問題はあなたの可能性が高いことです 宣言 コンパイラによって無視されるconstパラメーターがあります。それはです 意味 パラメーターにconstを効果的に使用する場合があります。

また、今も言及されています Google Mock FAQ これで、警告を取り除くために、削除してください const 関数宣言のパラメーターから。

私の場合、関数の実装はヘッダー内のテンプレートクラスであるため、宣言と定義が両方とも一緒に行われるため、まだ難しいと感じました。それに対する解決策は、おそらく、モックされたクラスのヘッダーを含めるときに警告を無効にすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top