использование шаблонов с векторами и векторными функциями

#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 ничего, кроме возвращаемого значения. Обычно параметр шаблона также используется как тип одного (или нескольких) параметров функций шаблона, и тогда компилятор сможет разрешить его напрямую.