【发布时间】:2021-08-30 18:28:02
【问题描述】:
我目前正在开发一个使用 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 或其他的普通类型,而是当我传递一个类时,我必须如何定义模板构造函数专业化的语法。因为它给了我错误:
boat 没有在这个作用域类数据库中声明。
如何声明正确?
【问题讨论】:
-
这里没有专门化构造函数,而是专门化了整个类
-
您可能想检查一下,vector 在访问任何索引之前确实包含 5 个元素。至于你得到的错误:我们应该怎么知道,为什么会发生这个错误?毕竟你没有显示声明。我只注意到一次可疑的缺少标头保护/编译指示,这可能是也可能不是错误,具体取决于具体情况。
标签: c++ templates c++14 specialization