最近我写了一个包含四个函数的类来打开和读取多列数据文件(最多 4 列)。在函数中,要打开的文件名“file_name”从主程序传递到类“Read_Columnar_File”中的函数。使用 std::vector 读取数据并传回主程序。但是,它要求程序员在每次使用时更改输入列的数据类型,这是错误的根源。文件名总是一个字符串,所以不需要模板化;但是,使用 vector 读取的数组的数据类型可能会发生变化,因此需要对其进行通用模板化。我正在尝试将该类转换为模板类,但缺少对制作包含 std::vector 的模板的过程的一些基本理解。为了简化开发过程,我回到了类中名为“Read_One_Column”的单个例程,并试图将其转换为数据类型标记为 Type1 的模板。我认为我的问题出在语法上,因为调试器告诉我主程序中的命令未定义。任何有助于纠正此问题的建议将不胜感激。现有代码的拷贝附在下面。
#include <vector>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <iterator>
template <class Type1> class Read_Columnar_File {
public:
void Read_One_Column(const std::string& file_name,std::vector<Type1>& Column1);
};
template <class Type1> void Read_Columnar_File<Type1>::Read_One_Column(const std::string& file_name,
std::vector<Type1>& Column1)
{
std::ifstream inp(file_name,std::ios::in | std::ios::binary);
std::istream_iterator<Type1> start((inp)), end;
if(inp.is_open()) {
Column1.assign(start,end);
}
else std::cout << "Cannot Open " << file_name << std::endl;
inp.close();
}
int main(int argc, const char * argv[]) {
int i;
std::vector<float> str1;
Read_Columnar_File<float> ob1;
char str[20];
std::strcpy(str,"Test.txt");
ob1.Read_One_Column(str,str1);
for(i=0; i < 7; i++) std::cout << str1[i] << std::endl;
return 0;
}
最佳答案
语法更简单:
template <typename Type1>
void Read_One_Column(const std::string& file_name,
std::vector<Type1>& Column1) {
...
}
根本不需要创建类(它只是一个模板函数)。
如果出于其他原因需要将函数放在类中,则语法相同
struct Read_Columnar_File {
...
template<typename Type1>
void Read_One_Column(const std::string& file_name,
std::vector<Type1>& Column1) {
...
}
}
它将是类的模板方法。
关于包含 std::vector 的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832940/