C++模拟Python input()时重载运算符'='歧义问题求助
问题分析
报错原因是:当给std::string赋值时,scan对象可隐式转换为string或char,而std::string的赋值运算符支持直接接收char,编译器无法确定选择哪种转换路径,因此产生歧义。
解决方案
方案一:保留原结构体写法,消除转换歧义
通过SFINAE技术限制char类型转换仅针对目标类型为char的场景,避免编译器在给string赋值时出现二义性:
#include <iostream> #include <string> #include <type_traits> struct scan { // 转换为std::string的运算符 operator std::string() { std::string s; std::cin >> s; return s; } // 仅当目标类型是char时启用该转换运算符 template<typename T, typename = std::enable_if_t<std::is_same_v<T, char>>> operator T() { char c; std::cin >> c; return c; } }; void solution() { char c; c = scan(); // 正常匹配char类型转换 std::string s; s = scan(); // 仅匹配string类型转换,无歧义 }
方案二:改用模板函数实现通用扫描功能
这种方式更符合C++静态类型特性,还支持int、double等更多基础类型:
#include <iostream> #include <string> template<typename T> T scan() { T val; std::cin >> val; return val; } void solution() { char c = scan<char>(); // 显式指定目标类型 std::string s = scan<std::string>(); // 也可通过auto简化其他类型的声明 auto d = scan<double>(); auto i = scan<int>(); }
内容的提问来源于stack exchange,提问作者Pushak
相关产品推荐
相关产品推荐

