我正在尝试模板化矢量。在我的主要内容中,我有以下内容:
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&)
我知道在实现模板功能时我遗失了一些东西,但我不确定是什么。感谢您提前的时间。
答案 0 :(得分:2)
如果我理解你真正想做的事情或许更像这样的事情:
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 中推断出你将返回值分配给类型应该是什么。没有提及像这样通过引用传递参数可以节省一些性能。
答案 1 :(得分:1)
尝试:
std::vector<Word> concordance = push_vector<Word>(data);
编译器无法在没有提示的情况下解析它,因为除了返回值之外的任何地方都不使用T
。通常,模板参数也用作模板函数的一个(或多个)参数的类型,然后编译器就可以直接解析它。