выходной вектор <T>в функции шаблона - PullRequest
0 голосов
/ 06 мая 2018

В этом разделе кода выдается ошибка:

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, ", "));

Что не так? Нужно ли специализировать каждую функцию шаблона?

1 Ответ

0 голосов
/ 08 мая 2018

Так как ответа не было, я думаю, я продолжу.

Подпись для ostream_iterator принимает C-строку, а не строку C ++:

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

Было выбрано, что неявное приведение к char * из std::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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...