GoogleMock:模拟返回多用户自定义转换类型的方法时遇歧义错误
解决Mock含多用户自定义转换对象时的编译器歧义错误
先看你给出的编译日志片段:
gdpr1@BEL081089 ~/Code/sandbox/mocking $ make && ./tests.exe
Scanning dependencies of target tests
[ 25%] Building CXX object CMakeFiles/tests.dir/Foo.cpp.o
[ 50%] Building CXX object CMakeFiles/tests.dir/FooTest.cpp.o
In file included from /cygdrive/c/GPDR1/Code/googletest/goo...
这种歧义错误我写单元测试时也踩过坑,本质是编译器处理mock方法返回值时,发现你的对象能通过多个自定义转换路径转成目标类型,没法确定选哪一个。给你几个实用的解决思路:
显式指定转换类型
在mock方法的Return调用里,用static_cast明确告诉编译器要转成哪个类型,直接消除歧义。举个例子:// 假设接口方法返回TypeX,你的对象obj有多个转换路径 ON_CALL(yourMock, targetInterfaceMethod()) .WillByDefault(Return(static_cast<TypeX>(obj)));把非必要的转换改成显式
如果你的类里有些自定义转换不是必须隐式调用的,给它们加上explicit关键字。这样编译器就不会把这些转换当作隐式候选,自然就不会有歧义了:class YourCustomObj { public: explicit operator TypeA() const; // 仅允许显式转换 operator TypeB() const; // 保留隐式(如果业务确实需要) };直接返回目标类型实例
绕开转换问题,直接构造接口方法预期返回的类型实例来返回,不用依赖原对象的转换逻辑:ON_CALL(yourMock, targetInterfaceMethod()) .WillByDefault(Return(TypeX{/* 直接传入构造参数 */}));
如果能拿到完整的编译错误信息(比如具体是哪两个转换导致的歧义),还可以针对性调整,但上面这三个方法基本能覆盖大部分场景了。
内容的提问来源于stack exchange,提问作者user9606488
相关产品推荐
相关产品推荐

