Google Mock:Mocked重载函数会创建警告C4373

时间:2011-01-09 11:33:28

标签: c++ visual-c++ mocking overloading googlemock

我正在使用Google Mock和VS2010模拟一个C ++类,它有2个重载函数:

#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 个答案:

答案 0 :(得分:9)

如果这是新代码,你应该没问题。 C4373 warning表示旧版Visual Studio违反了该标准。来自链接文档:

  

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分: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));
    // ...
};

答案 3 :(得分:1)

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

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

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

在我的情况下,我发现仍然很困难,因为函数实现是针对在声明和定义同时发生的标头中的模板化类。解决该问题的方法可能是在包含模拟类的标头时禁用警告。