首页 > 解决方案 > 使用类作为特化类型的模板类特化

问题描述

我目前正在使用 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而是当我传递一个类时,我必须如何定义模板构造函数专业化的语法。因为它给了我错误:

船没有在这个范围类数据库中声明。

我如何声明它是正确的?

标签: c++templatesc++14specialization

解决方案


你可以这样做:

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;
}

然后使用它们在文件中加载/存储数据。


推荐阅读