模板函数中std::ostream_iterator初始化匹配报错问题咨询
解决
std::ostream_iterator模板构造不匹配的问题 这问题我之前踩过坑,其实核心是**std::ostream_iterator的构造函数参数类型限制**在搞事情!
错误原因拆解
你看报错信息说找不到std::ostream_iterator<float>的匹配构造函数,问题出在第二个参数sep的类型上:
std::ostream_iterator的第二个构造参数要求是**const char*类型**,用来指定元素之间的分隔符;- 你的模板函数里把
sep定义成了std::string类型,C++不会自动把std::string隐式转换成const char*来匹配构造函数(虽然std::string有c_str()方法,但必须显式调用); - 而你在模板外直接输出
vector<float>时,应该是传了字符串字面量(比如","),它本身就是const char*,所以参数类型完全匹配,编译器自然不会报错。
两种可行的解决方案
方案1:修改函数参数类型为const char*
直接把分隔符参数改成const char*,这样调用时既可以传字符串字面量,也可以通过std::string的c_str()方法传值:
template <class T> void print_vector(vector<T>& v, const char* sep) { std::ostream_iterator<T> ostr_it(std::cout, sep) ; std::copy(begin(v), end(v), ostr_it); } // 调用示例 vector<float> nums = {1.1f, 2.2f, 3.3f}; print_vector(nums, ", "); // 直接传字符串字面量 std::string sep_str = " | "; print_vector(nums, sep_str.c_str()); // 传std::string的c_str()结果
方案2:保持std::string参数,显式转换为const char*
如果不想改参数类型,就在构造ostream_iterator的时候,用sep.c_str()把std::string转换成const char*:
template <class T> void print_vector(vector<T>& v, std::string sep) { std::ostream_iterator<T> ostr_it(std::cout, sep.c_str()) ; std::copy(begin(v), end(v), ostr_it); } // 调用示例 vector<float> nums = {1.1f, 2.2f, 3.3f}; print_vector(nums, ", "); // 支持字符串字面量(会隐式转成std::string) std::string sep_str = " | "; print_vector(nums, sep_str); // 直接传std::string对象
两种方案都能解决问题,选哪种看你更习惯哪种调用方式啦~
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

