9

Google Mockと VS2010を使用して、2 つのオーバーロードされた関数を持つ C++ クラスをモックしています。

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

理由はありますか?
これは正しい動作ですか?
どうすればこれを回避できますか?

4

4 に答える 4

9

これが新しいコードの場合は、問題ないはずです。C4373の警告は、古いバージョンのVisualStudioが標準に違反していることを示しています。リンクされたドキュメントから:

Visual C ++ 2008より前のバージョンのコンパイラは、関数を基本クラスのメソッドにバインドしてから、警告メッセージを発行します。後続のバージョンのコンパイラは、constまたはvolatile修飾子を無視し、関数を派生クラスのメソッドにバインドしてから、警告C4373を発行します。この後者の動作は、C++標準に準拠しています。

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

于 2011-01-09T11:40:08.497 に答える
6

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

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

于 2013-07-30T14:25:13.280 に答える