c++ - 使用类作为特化类型的模板类特化
问题描述
我目前正在使用 C++ 14 开发一个程序;基本上我正在实现一个名为 Database 的模板类,我想根据我的模板的不同专业化来区分这个模板类的构造函数。换句话说,当我将我的类型专门用于特定类时,我希望它做不同的事情。在我的示例中,当我将船类传递给它时,我想做不同的事情(船由具有 5 个字符串的构造函数定义)。'''
#include"boat.h"
#include<vector>
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
template <typename T>
class Database{
public:
Database(const string& file_name);
~Database();
void Add (const string& file_list);
void Upload (const string& file_list);
vector <T> get_vector();
protected:
vector <T> _list;
vector <T>_new_element;
string token,st;
string delimiter=";";
size_t pos=0;
vector <string> temp;
fstream f;
int max_id;
};
template <>
class Database<boat>
{
friend class boat;
public:
Database(const string& file_name){
f.open(file_name);
//controllo apertura file
if (f.is_open()) {
while ((getline(f, token))) {
while ((pos = token.find(delimiter)) != (string::npos)) {
st = token.substr(0, pos);
tempg.push_back(st);
token.erase(0, pos + delimiter.length());
}
tempg.push_back(token);
_list.push_back(boat(tempg[0],tempg[1],tempg[2],tempg[3],tempg[4]));
pos = 0;
tempg.clear();
}
}
};
~Database();
void Add (const string& file_list);
void Upload (const string& file_list);
const vector <boat> get_vector();
protected:
vector <boat> _list;
boat _new_element();
string token,st;
string delimiter=";";
size_t pos=0;
vector <string> tempg;
ifstream f;
};'''
所以基本上我用构造函数做了这个方法来打开一个文件并读取由';'分隔的类船的重要数据。
int
我的问题是:当我传递给模板时不是像 或其他的普通类型,char
而是当我传递一个类时,我必须如何定义模板构造函数专业化的语法。因为它给了我错误:
船没有在这个范围类数据库中声明。
我如何声明它是正确的?
解决方案
你可以这样做:
template<>
Database<boat>::Database(const string& file_name)
{
// ... your stuff here ...
}
但我认为更正确的设计是有构造函数的模板实现,然后有类的流输入和输出操作符boat
,即
std::istream& operator>>(std::istream& is, boat& obj)
{
// ... actual input here ...
return is;
}
std::ostream& operator<<(std::ostream& os, const boat& obj)
{
// ... actual output here ...
return os;
}
然后使用它们在文件中加载/存储数据。
推荐阅读
- laravel - 基于父表 LARAVEL 上的字段对元素进行分组
- android-layout - 在 adjustResize 期间不要折叠过去的 wrapContent
- amazon-web-services - 限制启用 VPC 的 Lambda 的 ENI 权限
- python - 使用 rest-framework 以 CSV 格式导出一个巨大的 django 查询集
- powershell - 将 Invoke-WmiMethod 命令转换为 Invoke-CimMethod 命令
- javascript - 如何在命令处理程序中运行嵌入命令
- javascript - 在 ReactJS 上使用 Props 打开和关闭对话框?我的模态保持打开而不关闭
- vba - VBA 继续编号列表
- python - 将 PyCuda 代码转换为 PyOpenCL 代码:如何执行大量 3x3 矩阵求逆?
- r - ggplot的限制轴