如何用GoogleMock模拟含Eigen::Tensor参数的类方法?
解决GMock中Eigen::Tensor模板逗号导致的编译错误
你遇到的问题是GMock的MOCK_METHOD宏会把括号内的逗号当成方法参数的分隔符,Eigen::Tensor<double, 5>里的逗号会被误判,导致编译器认为你的方法有2个参数,触发静态断言错误。下面是几种靠谱的解决方法:
给Tensor类型起别名:用
typedef或者using定义简化的类型名,避免在宏里直接写带逗号的模板类型:// 先定义别名 using My5DTensor = Eigen::Tensor<double, 5>; class MockMyClass { public: MOCK_METHOD(void, my_method, (My5DTensor&), (override)); };给类型加双层括号:GMock支持用双层括号把包含逗号的类型括起来,让编译器将其识别为单个类型参数:
class MockMyClass { public: MOCK_METHOD(void, my_method, ((Eigen::Tensor<double, 5>&)), (override)); };使用GMock的替代宏写法:较新版本的GMock可以尝试
MOCK_METHOD_T宏(专门处理带复杂模板的类型),不过前两种方法更通用:class MockMyClass { public: MOCK_METHOD_T(void, my_method, (Eigen::Tensor<double, 5>&), override); };
注意:原始MyClass中my_method的参数是引用类型,Mock时要保持一致(别漏掉&),否则会因签名不匹配导致override失败。
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

