Google模拟:模拟的超载功能创建警告C4373
-
08-10-2019 - |
题
我正在嘲笑一个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
从函数声明中的参数。
就我而言,我发现这仍然很难,因为该函数实现是针对标题内的模板类,在该类别中,声明和定义都是一起完成的。解决方案可能是在包括模拟班级的标题时禁用警告。
不隶属于 StackOverflow