#c #templates #vector
#c #шаблоны #вектор
Вопрос:
Я пытаюсь создать шаблон вектора. В моем основном у меня есть следующее:
std::vector<Word> concordance = push_vector(data);
Где Word — это структура, содержащая std::string и int, а data — это std::string . В моем заголовочном файле у меня есть:
template <typename T>
std::vector<T> push_vector(std::stringamp;);
Однако при компиляции я получаю следующую ошибку:
main.cpp: In function ‘int main(int, char**)’:
main.cpp:27:53: error: no matching function for call to ‘push_vector(std::stringamp;)’
main.cpp:27:53: note: candidate is:
templates.h:13:20: note: template<class T> std::vector<T> push_vector(std::stringamp;)
Я знаю, что мне чего-то не хватает, когда я реализую свою шаблонную функцию, но я не уверен, чего. Заранее благодарю вас за уделенное время.
Ответ №1:
Если я понимаю, что вы на самом деле хотите сделать, возможно, что-то более похожее на это:
template <typename T>
void push_vector(const std::stringamp; str, std::vector<T>amp; vec)
{
// convert str to T if possible
// throw on failure maybe?
// assign vec with converted data
}
Затем назовите это так:
std::string data("Hello");
std::vector<Word> concordance;
push_vector(data, concordance);
В противном случае вам пришлось бы явно указать функции аргумент шаблона, поскольку он не может вывести из значения rvalue, которое вы присваиваете возвращаемому значению, какой тип должен быть. Не говоря уже о передаче параметра out по ссылке, как это экономит вам некоторую производительность.
Комментарии:
1. Ваше предложение имеет наибольший смысл. Я реализовал это в своем коде, и это сработало отлично. Спасибо.
Ответ №2:
Попробуйте:
std::vector<Word> concordance = push_vector<Word>(data);
Компилятор не может разрешить это без подсказки, потому что вы не используете T
ничего, кроме возвращаемого значения. Обычно параметр шаблона также используется как тип одного (или нескольких) параметров функций шаблона, и тогда компилятор сможет разрешить его напрямую.