模板 class 和派生的 classes

Template class and derived classes

我已经模板化了 MyDatabase class 和两个派生的 classes Database_ADatabase_B。我有另一个使用 Database_ADatabase_B 的 class C。因此,每当我在 class C 中包含派生 class(Database_ADatabase_B)的 headers 时,它会给我这个错误 "Redefinition of MyDatabase"。我的猜测是,因为派生的class(Database_ADatabase_B)都在拖动模板class MyDatabase,这可能是重新定义[=12的原因=].但是我不知道怎么解决这个问题。

我的代码:

 template <typename U, class T> class My_DataBase {
     protected:
     std::map<U,T> Container
     public:
     void add();
     T* getNameToPointer(string key);
 };

 class Database_A: public My_Database <string,A> {
     add();
     A* getNameToPointer(name);
 };

 class Database_B: public My_DataBase <string,B> {
     add();
     B* getNameToPointer(name);
 };

 class C {
     private:
     Database_A Db_A;    // drage template class on back_end
     Database_B Db_B;    // drage template class on back_end
 };

我该如何解决这个问题?

您应该防止头文件被多重包含。 您可以通过在头文件顶部指定 #pragma once 指令来执行此操作(但我认为这是 Microsoft 特定的)。 更好的方法是用类似于以下的代码包围头文件:

#ifndef MYHEADER_FILENAME
#define MYHEADER_FILENAME
/// whatever contained in your header file
...
#endif // MYHEADER_FILENAME

您似乎有两个头文件,其中每个头文件都包含基础 class 和派生的 class。这就是为什么您会收到重定义错误的原因。

要避免此问题,请执行以下操作:使用三个头文件并包含保护程序。基础 class 将在一个名为 "My_DataBase.h" 的头文件中。其他两个头文件(每个派生一个 class)将包含 "My_DataBase.h".

但是,由于您可能想要包含两个头文件(派生的 classes),您需要使用包含保护来避免重新定义基础 class。

所以这是一个例子:

My_DataBase.h

#ifndef MY_DATABASE_H
#define MY_DATABASE_H
template <typename U, class T> class My_DataBase {
 protected:
 std::map<U,T> Container
 public:
 void add();
 T* getNameToPointer(string key);
}
#endif

Database_A.h

#ifndef DATABASE_A_H
#define DATABASE_A_H

#include "My_DataBase.h"

class Database_A: public My_Database <string,A> {
 add();
 A* getNameToPointer(name);
}

Database_B.h

#ifndef DATABASE_B_H
#define DATABASE_B_H

#include "My_DataBase.h"

class Database_B:public My_DataBase <string,B> {
  add();
  B* getNameToPointer(name);
}