我正在嘲笑一个C ++类,该类具有2个超载功能 Google模拟 和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));
    // ...
};

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

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 ++标准。

只有当您违反视觉工作室的不正确行为的代码破坏时,这才是一个问题。

其他提示

对我(在VS 2010中),指定 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模拟常见问题解答 现在,为了摆脱警告,请删除 const 从函数声明中的参数。

就我而言,我发现这仍然很难,因为该函数实现是针对标题内的模板类,在该类别中,声明和定义都是一起完成的。解决方案可能是在包括模拟班级的标题时禁用警告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top