使用带有向量和向量函数的模板
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
。通常,模板参数也作为模板函数的一个(或多个)参数的类型,编译器可以直接解析。
【讨论】:
以上是关于使用带有向量和向量函数的模板的主要内容,如果未能解决你的问题,请参考以下文章