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

每次编译时,我都会收到以下警告两次:

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警告表示旧版本的 Visual Studio 违反了标准。从链接的文档中:

Visual C++ 2008 之前的编译器版本将函数绑定到基类中的方法,然后发出警告消息。编译器的后续版本忽略 const 或 volatile 限定符,将函数绑定到派生类中的方法,然后发出警告 C4373。后一种行为符合 C++ 标准。

如果您破坏了依赖于 Visual Studio 不正确行为的代码,这只会是一个问题。

于 2011-01-09T11:40:08.497 回答
6

对我来说(在 VS 2010 中),指定const原始类型参数(我看到你也有)会导致这种行为。每当我想要覆盖的基类函数中存在这种情况时,我无法以某种方式指定模拟,以免出现此警告;当只有类类型 const 值 / const 引用参数时,警告永远不会发生。

所以对我来说,这种情况下的警告似乎实际上是编译器中的一个错误(因为签名完全相同)。

于 2013-07-30T14:25:13.280 回答
1

建议的替代方法:

#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));
    // ...
};
于 2014-06-20T11:18:21.167 回答
1

我意识到这是一个老问题,但是由于我现在自己偶然发现了这个问题,所以我想分享我的解决方案(或者至少是解释):

问题很可能是您的声明有一个 const 参数,编译器将忽略该参数。它是可以有效地使用 const 作为参数的定义。

现在在google mock faq中也提到了,为了摆脱警告,const从函数声明中的参数中删除。

在我的情况下,我发现它仍然很难,因为函数实现是针对头内的模板类,其中声明和定义都发生在一起完成。解决方案可能是在包含模拟类的标题时禁用警告。

于 2018-07-19T07:32:18.150 回答