我正在使用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'
知道为什么吗? 这是正确的行为吗? 我怎么能避免这个?
答案 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
。
在我的情况下,我发现仍然很困难,因为函数实现是针对在声明和定义同时发生的标头中的模板化类。解决该问题的方法可能是在包含模拟类的标头时禁用警告。