首页 > 解决方案 > 输出向量在模板函数中

问题描述

这部分代码给出了一个错误:

template <class T>
void print_vector(vector<T>& v, string sep)
{
    std::ostream_iterator<T> ostr_it(std::cout, sep) ;
    std::copy(begin(v), end(v), ostr_it);
}

main.cpp:17:30:错误:没有匹配的构造函数用于初始化 'std::ostream_iterator<float>' std::ostream_iterator<T> ostr_it(std::cout, sep);

我很困惑,因为如果我在模板函数之外执行此操作并直接输出向量,则不会出现错误:

vector<float> result(elements);
std::copy(begin(result), end(result), ostream_iterator<float>(cout, ", "));

怎么了?我需要专门化每个模板功能吗?

标签: c++c++11

解决方案


由于没有发布答案,我想我会继续。

接受的签名ostream_iterator是 C 字符串,而不是 C++ 字符串:

std::ostream_iterator(ostream_type& stream, const CharT* delim)

已选择隐式转换为char *fromstd::string是不可取的,如此所述,因此您会收到错误消息。

要使其工作,您可以简单地转换std::string自己:

std::ostream_iterator<T> ostr_it(std::cout, sep);         // DOES NOT WORK
std::ostream_iterator<T> ostr_it(std::cout, sep.c_str()); // WORKS

推荐阅读