使用带有向量和向量函数的模板

Posted

技术标签:

【中文标题】使用带有向量和向量函数的模板【英文标题】:using templates with vectors and vector functions 【发布时间】:2011-10-18 20:02:02 【问题描述】:

我正在尝试对向量进行模板化。我主要有以下几点:

std::vector<Word> concordance = push_vector(data);

其中 Word 是包含 std::string 和 int 的结构,而 data 是 std::string。在我的头文件中,我有:

 template <typename T>
 std::vector<T> push_vector(std::string&);

但是当我编译时出现以下错误:

main.cpp: In function ‘int main(int, char**)’:
main.cpp:27:53: error: no matching function for call to ‘push_vector(std::string&)’
main.cpp:27:53: note: candidate is:
templates.h:13:20: note: template<class T> std::vector<T> push_vector(std::string&)

我知道我在实现模板功能时遗漏了一些东西,但我不确定是什么。提前感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

如果我理解你真正想要做的事情可能更像这样:

template <typename T>
void push_vector(const std::string& str, std::vector<T>& 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 参数可以节省一些性能。

【讨论】:

您的建议最有意义。我在我的代码中实现了它,它运行良好。谢谢。【参考方案2】:

试试:

std::vector<Word> concordance = push_vector<Word>(data);

编译器无法在没有提示的情况下解析它,因为您不会在返回值以外的任何地方使用T。通常,模板参数也作为模板函数的一个(或多个)参数的类型,编译器可以直接解析。

【讨论】:

以上是关于使用带有向量和向量函数的模板的主要内容,如果未能解决你的问题,请参考以下文章

缺少带有向量的模板参数

模板类和向量

将向量传递给模板函数

用于清除指针向量的模板函数

如何实现从模板参数返回向量的模板函数?

C++ 支持向量机 (SVM) 模板库?