2016-07-13 8 views
0

は、質問のためのコードです:インターフェイスから継承し、別の実装ファイルを持つテンプレートクラスを正しく構築する方法。ここ

PlainInterface.h

/** PlainInterface.h */ 
#ifndef _PLAIN_INTERFACE 
#define _PLAIN_INTERFACE 

#include <vector> 

template <class ItemType> 
class PlainInterface{ 
public: 
    virtual int getSize() const = 0; 
}; 
#endif 

Plain.h

/** Plain.h */ 
#ifndef _PLAIN 
#define _PLAIN 
#include "PlainInterface.h"; 

template <class ItemType> 
class Plain: public PlainInterface <ItemType> { 
private: 
    std::vector<ItemType> a; 

public: 
    Plain(); 
    ~Plain(); 

    int getSize() const; 
}; 
#include "Plain.cpp" 
#endif 

Plain.cpp

/* Plain.cpp */ 
#include <iostream> 
#include "Plain.h" 

//Constructors 
template <class ItemType> 
Plain<ItemType>::Plain() { 
    std::cout << "Created\n"; 
} 

template <class ItemType> 
Plain<ItemType>::~Plain() { 
    std::cout << "Destroyed\n"; 
} 

template <class ItemType> 
int Plain<ItemType>::getSize() const { return 0; } 

したがって、this questionによると、ヘッダーファイルにすべての実装を含めるか、 "Plain.h"ファイルの末尾に#include "Plain.cpp"を入れるか、明示的なインスタンス化を "Plain"の最後に置くことができます.cpp "ファイル。私はファイルを別にしておき、テンプレートに許可されているものを制限しないでください。私は第二の選択肢を試しましたが、うまくいきませんでした。 私が得ているエラーは、Plain.cppのコンストラクタ/ deconstructor/getSize定義が既に定義されていることです。私はここで間違って何をしていますか?

+0

、あなたは*も*のcppファイルをコンパイルするべきではありません別々に。 –

+0

.cppファイルにインクルードガードを入れる必要がありますか? – kingcobra1986

答えて

0

.cppファイルで#include "Plain.h"を削除する必要があります。それ以外の場合は循環インクルードを作成します。

例:

//a.h 
... 
#include "b.cpp" 

//b.cpp 
#include "a.h" 

Bが含まれ、Bは、そうで含まれ、あろう。これはおそらく、あなたが言及した2番目のオプションが機能しなかった理由です。あなたの問題に適用されます。ここ

別の答え(と思う):あなたは.hファイルに `の#include「Plain.cppを」`置く場合https://stackoverflow.com/a/3127374/2065501

+0

3つのファイルを分離したままにする適切な方法は何ですか?また、テンプレートを使用しても機能しますか? – kingcobra1986

+0

@ kingcobra1986私は自分のプロジェクトに自分のコードを実際にコピーして貼り付け、ヘッダーに '#include" Plain.cpp "部分を削除しました。 – user2065501

+0

それは私がビジュアルスタジオを使っているからだと思いますか? – kingcobra1986

関連する問題