模板函数中的输出向量<t>

时间:2018-05-06 19:47:16

标签: c++ c++11

这部分代码给出了错误:

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:错误:没有匹配的构造函数用于初始化&#39; std :: ostream_iterator&lt; float&gt;&#39;      的std :: ostream_iterator&LT; T&GT; ostr_it(std :: cout,sep);

我很困惑,因为如果我在模板函数之外进行并直接输出向量,则没有错误:

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

有什么问题?我是否需要专门化每个模板功能?

1 个答案:

答案 0 :(得分:3)

由于没有回复,我想我会继续。

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

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

已经选择char *来自std::string隐式广告是不可取的,如here所述,因此您会收到错误。

要使其有效,您只需自己投射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