我试图返回带有模板T的向量,该向量包含来自文件的数据,以便在另一个函数中进行搜索。
我正在处理的程序是一个程序,它存储输入到该程序的名称,出生日期和地址。我试图将返回的向量存储在具有模板类型的另一个向量中,但是它一直显示:
错误C2672'getDataToVector':找不到匹配的重载函数
错误C2783'std :: vector> getDataToVector(std :: ifstream)':无法推断出'T'的模板参数
template <class T>
void searchData(vector<string>& name, vector<int>& birthdate, vector<string>& address) {
bool found = false;
string entry;
string line;
int i = 0;
cout << "Please enter the name you want to search: " << endl;
getline(cin, entry);
std::ifstream in;
in.open("test_file.txt");
vector<T> file_data = getDataToVector(in);
while (!found) {
if (std::find(file_data.begin(), file_data.end(), entry) != file_data.end()) {
cout << "The name is found" << endl;
cout << file_data[i] << endl;
found = true;
}
i++;
}
}
template <class T>
vector<T> getDataToVector(std::ifstream infile) {
vector<T> data;
string line;
while (getline(infile, line)) {
data.push_back(line);
}
return data;
}
我是c ++编程的初学者,非常感谢任何人都能给我的帮助。
答案 0 :(得分:2)
该错误表明无法推断T
中的getDataToVector
应该是什么。可以从参数推导得出(不适用于您的情况),也可以明确设置:getDataToVector<std::string>(in);
表示T==std::string
。在您的情况下,您想从T
-> searchData
getDataToVector<T>(in);
但是看您的代码根本不需要模板,line
总是std::string
,所以data.push_back(line);
意味着只有std::vector<std::string>
才有意义。与searchData
相同,因为T
被撤消,甚至不属于函数签名。
答案 1 :(得分:1)
对于初学者来说,函数getDataToVector
如果不是类的成员函数,则应在函数searchData
之前声明,因为它是在函数中引用的。
第二,该函数的参数应为引用
模板
vector<T> getDataToVector(std::ifstream &infile) {
^^^
该函数是模板函数,无法推断出模板参数,因此您应该编写
vector<T> file_data = getDataToVector<T>(in);
^^^