【问题标题】:macro MOCK_METHOD passed 3 arguments, but takes just 2 error with std::pair宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误
【发布时间】: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 参数的方法上使用,而不是返回它

【问题讨论】:

    标签: c++ macros std-pair googlemock


    【解决方案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());
      };
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2011-07-06
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多