这段代码给出了一个错误:
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
" std::ostream_iterator ostr_it(std::cout, sep(;
我很困惑,因为如果我在模板函数之外执行此操作并直接输出向量,则没有错误:
vector<float> result(elements);
std::copy(begin(result), end(result), ostream_iterator<float>(cout, ", "));
怎么了?我是否需要专门化每个模板功能?
由于没有发布答案,我想我会继续。
ostream_iterator
的签名接受的是 C 字符串,而不是C++字符串:
std::ostream_iterator(ostream_type& stream, const CharT* delim)
已选择从std::string
隐式强制转换为char *
是不可取的,如此处所述,因此您会收到错误。
要使其正常工作,您只需自己投射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