宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误
Posted
技术标签:
【中文标题】宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误【英文标题】:macro MOCK_METHOD passed 3 arguments, but takes just 2 error with std::pair 【发布时间】:2015-02-15 23:41:10 【问题描述】:我使用的是 Google Mock 1.6.0。使用 MOCK_METHODN
宏时,似乎认为我正在为返回 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
参数的方法上使用,而不是返回它
【问题讨论】:
【参考方案1】:在FAQ GoogleMock:
如果返回类型包含不受保护的逗号,您仍然需要 typedef,但这种情况要少得多。
使用类型定义
【讨论】:
【参考方案2】:这似乎是 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());
;
【讨论】:
如果升级到 1.7.0 不是一个选项,这里有一个问题有很多解决方法:***.com/questions/13842468/comma-in-c-c-macro。以上是关于宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误的主要内容,如果未能解决你的问题,请参考以下文章
Confluence 6 用户宏示例 - Color and Size