C++ const char[]转自定义field类报错:请求转换为非标量类型
问题原因
你遇到的报错是C++隐式转换规则限制导致的:
使用type obj = value语法的复制初始化场景下,最多只允许1次用户定义的隐式转换。你的代码中"Hello"是const char[6]类型,要转换为field<std::string>需要两次用户定义转换:
const char[6]转换为std::stringstd::string转换为field<std::string>
超出了转换次数限制,因此编译器直接报错。而直接构造的语法field<std::string> strA("Hello")属于直接初始化,允许多次转换匹配构造函数参数,因此可以正常运行。
修复方案
给field类添加泛型构造函数,直接接收所有可隐式转换为T的参数,避免二次转换,同时可以兼容你需要的指定初始化器用法:
#include <type_traits> #include <memory> #include <utility> template<typename T> class field { std::unique_ptr<T> t_; public: field() : t_(nullptr) {} // 保留原有构造函数 field(const T &t) : t_(std::make_unique<T>(t)) {} // 新增泛型构造:支持所有可转换为T的入参,仅做一次隐式转换 template<typename U, typename = std::enable_if_t<std::is_convertible_v<U, T>>> field(U&& u) : t_(std::make_unique<T>(std::forward<U>(u))) {} // 可选:添加泛型赋值运算符,支持后续直接赋值非T类型参数 template<typename U, typename = std::enable_if_t<std::is_convertible_v<U, T>>> field<T>& operator=(U&& u) { t_.reset(new T(std::forward<U>(u))); return *this; } };
修改后你的测试代码可以正常编译,同时包含field成员的结构体使用指定初始化器传参时,也可以直接传入字符串常量、布尔值等对应类型的参数,不需要额外转换。
如果你不想修改field类的定义,也可以手动显式转换解决报错:
field<std::string> strB = std::string("Hello");
内容的提问来源于stack exchange,提问作者Aido
相关产品推荐
相关产品推荐

