宏 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
如果我:
,则不会出现此错误
- 将
std::pair<int, int>
替换为 int
或 void
等简单类型
- 在具有
std::pair
参数的方法上使用,而不是 returning 它
这似乎是 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());
};
You still need a typedef if the return type contains an unprotected comma, but that's much rarer.
使用typedef
我正在使用 Google Mock 1.6.0。使用 MOCK_METHODN
宏时,似乎认为我正在为 return a std::pair
:
#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
如果我:
,则不会出现此错误- 将
std::pair<int, int>
替换为int
或void
等简单类型
- 在具有
std::pair
参数的方法上使用,而不是 returning 它
这似乎是 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());
};
You still need a typedef if the return type contains an unprotected comma, but that's much rarer.
使用typedef