2017-09-21 18 views
2

テンプレートMyDatabaseクラスと2つの派生クラスDatabase_ADatabase_Bがあります。私は別のクラスCを持っていて、それはDatabase_ADatabase_Bを使っています。したがって、クラスCに両方の派生クラス(Database_ADatabase_B)のヘッダーを含めるときは、このエラー "Redefinition of MyDatabase"が表示されます。私の推測は、両方の派生クラス(Database_ADatabase_B)がテンプレートクラスMyDatabaseをドラッグしているため、MyDatabaseの再定義の理由になる可能性があります。しかし、私はこの問題を解決する方法を知らない。テンプレートクラスと派生クラス

マイコード:

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

どのように私はこの問題を解決することができますか?

+2

は私たちに、完全な最小限の例を表示します。これはCではない、これはC++です。 – gsamaras

+0

簡単な説明は、私はテンプレートクラスAと2つの派生クラスBとCを持っている今、私はクラスBとCの両方を使用している別のクラスDを持っているので、私はB&私はクラスAの再定義のエラー。だからこの問題を避けるには? –

+0

あなたの質問をヘッダーファイルで更新してくださいありがとうございます。 – gsamaras

答えて

2

に思えます。そのため、再定義エラーが発生します。

この問題を回避するには、次の操作を行います。3つのヘッダーファイルを使用し、ガードを含めます。基本クラスは、 "My_DataBase.h"という1つのヘッダーファイルに格納されます。他の2つのヘッダーファイル(すべてのデライブされたクラスに1つ)には "My_DataBase.h"が含まれます。

ただし、(派生クラスの)両方のヘッダーファイルを含める必要がある場合があるため、ベースクラスの再定義を避けるためにインクルードガードを使用する必要があります。だからここ

は一例です:

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

複数のヘッダーファイルが含まれないようにする必要があります。 これは、ヘッダーファイルの先頭に#pragma once命令を指定することによって行うことができます(ただし、Microsoft固有のものだと思います)。 より良い方法は、次のようなコードで、あなたのヘッダファイルを囲むようにある:あなたは、各ヘッダファイルは、基底クラスとdereivedクラスが含まれている2つのヘッダファイルを、持っているよう

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

'#pragma once'は技術的にはコンパイラ固有のものですが、実際にはほぼすべてのコンパイラで動作します。 Visual Studio、GCC、Clang。 –

+0

今それは完璧に感謝します! –