CMake生成的VS2019项目报Ambiguous user-defined-conversion错误,常规项目正常
问题分析与解决方案
你的代码在CMake生成的VS2019项目中出现歧义转换错误,根源是不同项目的C++标准设置差异:常规VS项目可能默认使用C14或更早标准,而CMake生成的项目默认启用了C17(或更高)标准,后者对转换函数的重载解析规则更严格,检测出了代码中的歧义。
当执行int *f = a;时,左值a有两条可行的转换路径:
- 调用基类
B的operator int*() const(const成员函数可被左值调用),直接得到int*; - 将左值
a强制转换为右值后,调用A的operator int*&&() &&,得到int*&&再隐式转换为int*。
C++17及以后的标准会将这两条路径视为等价,触发歧义错误;而更早的标准不会考虑右值限定的转换函数用于左值场景,因此能正常编译。
解决方法
方法一:添加左值版本的转换函数(推荐)
在A中补充左值限定的转换函数,明确左值对象的转换逻辑,消除歧义:
struct B { operator int*() const { return p; } int *p; }; struct A : public B { // 左值const版本,覆盖/补充基类的转换逻辑 operator int*() const & { return p; } operator int * &&() && { auto r = p; p = nullptr; return std::move(p); } };
方法二:明确指定转换路径(临时 workaround)
如果不想修改类结构,可以在初始化时显式指定调用基类的转换函数:
void fun() { A a; int *f = static_cast<const B&>(a); // 明确调用B的转换函数 int *b = std::move(a); }
方法三:调整CMake的C++标准设置
在CMakeLists.txt中强制指定使用C++14标准,匹配常规VS项目的行为:
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON)
但这种方法不推荐,因为它回避了代码本身的歧义问题,不利于长期维护。
内容的提问来源于stack exchange,提问作者yumzeth lane
相关产品推荐
相关产品推荐

