宏 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&lt;int, int&gt; 替换为intvoid 等简单类型 在具有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&lt;int, int&gt; 中的, 解释为另一个参数。因此,您也可以通过避免使用, 来解决此问题,例如使用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 个错误的主要内容,如果未能解决你的问题,请参考以下文章

宏传递了 2 个参数,但只需要 1 个

如何将现有参数从报表传递到查询

Confluence 6 用户宏示例 - Color and Size

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

C宏传递号而不是变量

宏函数和内联