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

如何用Google Mock模拟含多模板参数的std::make_shared函数?

解决GMOCK模拟带模板参数函数的编译错误

你的问题出在GMOCK的MOCK_METHOD宏解析上,预处理器会把类型中的语法符号(哪怕是模板参数里的)误当作宏参数的分隔符,导致参数计数错误。要修复这个问题,只需要把包含模板的返回类型用额外的括号包裹起来即可。

修复后的代码

#include <memory>
#include <string>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

template <typename T, typename... Args>
class MakeSharedMock {
 public:
  // 给返回类型加上外层括号,避免预处理器误解析
  MOCK_METHOD((std::shared_ptr<T>), MakeShared, (Args... args), (const noexcept));
};

int main(){
    MakeSharedMock<std::string> mock_make_shared;
}

原因解释

GMOCK的MOCK_METHOD是预处理器宏,它通过逗号拆分四个核心参数:返回类型、方法名、参数列表、修饰符。当返回类型是std::shared_ptr<T>这类模板类型时,预处理器可能错误地将模板相关语法识别为宏参数分隔标记,导致宏识别的参数数量不符,触发你看到的静态断言错误。

用括号包裹返回类型后,预处理器会把整个(std::shared_ptr<T>)当作一个完整的宏参数,就能正确完成解析。这种处理方式同样适用于所有包含逗号的复杂类型(比如std::map<int, std::string>)。

关于模拟多模板参数函数

完全可以模拟带多个模板参数的函数,你只需要:

  • 用类模板的参数对应原函数的模板参数(比如这里的T和Args...对应std::make_shared<T>(Args...)的模板参数)
  • 确保MOCK_METHOD的参数被预处理器正确解析(用括号包裹含模板/逗号的类型)

这样就能创建出对应不同模板参数组合的mock类实例,模拟原函数的行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:53:15