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

如何解决GMock中指针与引用版重载函数的调用歧义问题?

问题原因与解决办法

错误原因

当调用EXPECT_CALL(m_mockINF, MY_MACRO_func(_)).Times(0);时,_是Google Mock的万能匹配器(AnythingMatcher),编译器无法区分它应该匹配指针参数版还是引用参数版的my_func重载函数——两个版本的Mock函数都能接受这个匹配器,因此触发重载决议歧义。

解决办法

核心思路是明确指定匹配器对应的参数类型,让编译器能确定要绑定到哪个重载版本:

1. 针对特定版本单独校验

如果要禁止指针版调用:

EXPECT_CALL(m_mockINF, MY_MACRO_func(TypedEq<my_type*>(_))).Times(0);

如果要禁止引用版调用:

EXPECT_CALL(m_mockINF, MY_MACRO_func(TypedEq<my_type&>(_))).Times(0);

TypedEq<T>会明确告诉编译器匹配器对应的参数类型,消除歧义。

2. 同时禁止两个版本的调用

如果需要确保两个重载版本都没有被调用,直接分别写两个EXPECT_CALL即可:

EXPECT_CALL(m_mockINF, MY_MACRO_func(TypedEq<my_type*>(_))).Times(0);
EXPECT_CALL(m_mockINF, MY_MACRO_func(TypedEq<my_type&>(_))).Times(0);

3. 替代方案:使用MatcherCast

也可以用MatcherCast来强制转换匹配器类型,效果和TypedEq一致:

// 禁止指针版
EXPECT_CALL(m_mockINF, MY_MACRO_func(MatcherCast<my_type*>(_))).Times(0);
// 禁止引用版
EXPECT_CALL(m_mockINF, MY_MACRO_func(MatcherCast<my_type&>(_))).Times(0);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:02:36