You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GMock Mock相同入参个数重载方法时的歧义如何解决?

问题原因

通配符匹配器_本身不携带类型信息,编译器无法判断EXPECT_CALL中要匹配的是PrintValue的哪个重载版本,无法完成重载决议,因此抛出歧义报错。

解决方法

共有三种常用方案可以明确指定匹配的重载版本,消除歧义:

  • 方案1:使用带类型的通用匹配器An<T>()/A<T>()
    这是最简洁的方案,直接在匹配器中声明要匹配的参数类型即可:

    // 匹配int类型的重载
    EXPECT_CALL(mock, PrintValue(An<const int&>())).Times(1);
    // 若要匹配string类型的重载,修改为:
    // EXPECT_CALL(mock, PrintValue(An<const std::string&>())).Times(1);
    
  • 方案2:使用TypedEq<T>()匹配特定参数值
    如果需要匹配具体的参数值而非任意值,可以用TypedEq明确指定类型:

    // 明确匹配传入int类型值42的调用
    EXPECT_CALL(mock, PrintValue(TypedEq<const int&>(42))).Times(1);
    
  • 方案3:显式指定函数签名
    可以通过强制转换方法指针的方式指定要匹配的重载,适合复杂重载场景,确定性最高:

    // 显式指定要匹配的是接收const int&、返回void的const成员函数重载
    EXPECT_CALL(mock, (static_cast<void (MyClassMock::*)(const int&) const>(&MyClassMock::PrintValue))(_)).Times(1);
    

将示例代码中的EXPECT_CALL替换为上述任意一种符合需求的写法,即可正常编译运行。

内容的提问来源于stack exchange,提问作者tjwrona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 08:45:00