宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 只出现了 2 个错误

macro MOCK_METHOD passed 3 arguments, but takes just 2 error with std::pair

我正在使用 Google Mock 1.6.0。使用 MOCK_METHODN 宏时,似乎认为我正在为 return a std::pair:

的方法传递 3 个参数
#include <gmock/gmock.h>
#include <utility>
class IFoo {
public:
    virtual std::pair<int, int> bar() = 0;
};
class MockFoo {
public:
    MOCK_METHOD0(bar, std::pair<int, int>());
};
int main() {
    MockFoo f;
    return 0;
}

编译器输出(GCC 4.6.3):

main.cpp:9:44: error: macro "MOCK_METHOD0" passed 3 arguments, but takes just 2
main.cpp:9:5: error: ‘MOCK_METHOD0’ does not name a type

如果我:

,则不会出现此错误

这似乎是 1.6.0 版的错误。相同的代码适用于 版本 1.7.0,因此最好的解决方案是 升级到

或者,使用 Clang 编译也会遇到同样的错误,但提供了错误所在的有力线索:

main.cpp:9:38: error: too many arguments provided to function-like macro invocation
    MOCK_METHOD0(bar, std::pair<int, int>());
                                     ^
main.cpp:9:5: error: C++ requires a type specifier for all declarations
    MOCK_METHOD0(bar, std::pair<int, int>());
    ^~~~~~~~~~~~
2 errors generated.

看起来有问题的宏扩展正在将 std::pair<int, int> 中的 , 解释为另一个参数。因此,您也可以通过避免使用 , 来解决此问题,例如使用 typedef:

typedef std::pair<int, int> MyType;
class MockFoo {
public:
    MOCK_METHOD0(bar, MyType());
};

FAQ GoogleMock中:

You still need a typedef if the return type contains an unprotected comma, but that's much rarer.

使用typedef