C ++模板成员对象

时间:2015-01-13 09:12:51

标签: c++ templates

我遇到了一个问题,一个设计问题。这个模板类代表文件处理/驱动程序接口。这是该课程的准系统。

---------------------------- FileDriver.h ---------------- -----------

namespace DatabaseManager {

template<class T>
class FileDriver {

FileDriver(const char *file_name) : file_name(file_name) {}
public : 

T* fetch(size_t rec_size, long rec_num, long offset , bool write_enabled) {

// fetch data from file
}

int insert(T *rec, size_t rec_size, long rec_num, long offset) {

// insert data into file

}

inline int release(T *rec, size_t rec_size, int rec_num) {
 // close the file

}

};

}

现在,该类由系统中需要I / O操作的任何类使用。但作为一个模板类,所以每次我需要访问一个文件时我都要创建这个类的对象。例如,以下是函数如何使用此类。

 ---------------------- ParseSparseParticles.cpp ------------------

     #include "FileDriver.h"

     bool ParseSparseParticles::openFile() throw(ParseSparseParticlesException)
    {

       // DatabaseManager::FileMetaInfo is a struct containing meta information about a file
      DatabaseManager::FileMetaInfo *meta_info = nullptr;
      DatabaseManager::SparseParticles *particle_data = nullptr; 

      DatabaseManager::FileDriver<DatabaseManager::FileMetaInfo> meta_hndlr(meta_file_name.str().c_str());
      meta_info = meta_hndlr.fetch(sizeof(DatabaseManager::FileMetaInfo), 1, static_cast<int>(DatabaseManager::file_map_pos::START), false);

      if (meta_info) {

        DatabaseManager::FileDriver<DatabaseManager::SparseParticles> data_hndlr(file_name.str().c_str());

        particle_data = data_hndlr.fetch(sizeof(DatabaseManager::SparseParticles),
                                   meta_info->num_rec, static_cast<int>(DatabaseManager::file_map_pos::START), false);

        if (particle_data) {
          data_hndlr.release(particle_data, sizeof(DatabaseManager::SparseParticles), meta_info->num_rec);
          meta_hndlr.release(meta_info, sizeof(DatabaseManager::FileMetaInfo), 1);
          return true;
        } else {
          throw ParseSparseParticlesException("Cannot open Sparse Particles File");
        }

      } else {
        throw ParseSparseParticlesException("Cannot open Meta Info File");
      }

    }

所以我每次需要访问任何文件时都必须遵循这个完全相同的步骤。 1.打开元信息文件 2.打开实际的数据文件 3.关闭数据文件 4.关闭元文件

这会在一段时间后变得令人厌烦,更糟糕的是它导致重复的代码,非结构化的代码,因为文件操作在整个系统中完成。所以我在考虑创建一个抽象I / O操作的接口。在这样做的过程中我偶然发现我想创建接口类的FileDriver成员对象,就像这样

    --------------------------- IOInterface.h ---------------------------


    #include "FileDriver.h"

    template<typename MetaFileType, typename FileType>
    class IOInterface {

    DatabaseManager::FileDriver<MetaFileType> meta_orb; // won't compile 

    DatabaseManager::FileDriver<FileType> data_orb; // won't compile

    };

但是这不会编译,因为我将模板头包含在另一个模板头中。所以可以请任何人告诉我如何解决这个问题。我怎样才能创建一个类似于FileDriver接口的类,只要该类对象处于活动状态,它就会存储FileDriver对象。

由于

更新

编译时遇到的错误是使用IOInterface构造函数。

IOInterface::IOInterface(std::string data_dir, std::string file_prefix, int id) :
  data_dir(data_dir),
  file_prefix(file_prefix),
  file_id(id)
{}

/var/local/PolymerizationSimulation/include/IOInterface.h:7: error: no matching function for call to 'DatabaseManager::FileDriver<DatabaseManager::MetaFileType>::FileDriver()'

/var/local/PolymerizationSimulation/include/IOInterface.h:7: error: no matching function for call to 'DatabaseManager::FileDriver<DatabaseManager::FileType>::FileDriver()'

1 个答案:

答案 0 :(得分:0)

查看代码时的一些提示:

课后定义你错过了分号:

};
 ^

同样来自您的示例,FileDriver不在DatabaseManager中

在这堂课中:

template<class T>
    class FileDriver {

所有成员都是私有的,甚至是构造函数,因此您无法访问它。最后,这个类不提供以下所需的默认构造函数:

DatabaseManager::FileDriver<MetaFileType> meta_orb; // won't compile 
DatabaseManager::FileDriver<FileType> data_orb; // won't compile

所以编译器不知道如何创建这些实例,为FileDriver添加它:

FileDriver(){}