【问题标题】:Template class specialization using class as type for the specialization使用类作为特化类型的模板类特化
【发布时间】: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;

};'''

所以基本上我用构造函数做这个方法来打开一个文件并读取被';'分隔的类船的重要数据。

我的问题是:当我传递给模板时不是像intchar 或其他的普通类型,而是当我传递一个类时,我必须如何定义模板构造函数专业化的语法。因为它给了我错误:

boat 没有在这个作用域类数据库中声明。

如何声明正确?

【问题讨论】:

  • 这里没有专门化构造函数,而是专门化了整个类
  • 您可能想检查一下,vector 在访问任何索引之前确实包含 5 个元素。至于你得到的错误:我们应该怎么知道,为什么会发生这个错误?毕竟你没有显示声明。我只注意到一次可疑的缺少标头保护/编译指示,这可能是也可能不是错误,具体取决于具体情况。

标签: c++ templates c++14 specialization


【解决方案1】:

你可以这样做:

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

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

【讨论】:

  • Ty 对于操作员提示,我认为您是绝对正确的,最好与操作员一起加载和阅读。对于专业化,我将在接下来的几天尝试使用该方法,看看它是否会起作用...... Ty!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多