は、質問のためのコードです:インターフェイスから継承し、別の実装ファイルを持つテンプレートクラスを正しく構築する方法。ここ
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定義が既に定義されていることです。私はここで間違って何をしていますか?
、あなたは*も*のcppファイルをコンパイルするべきではありません別々に。 –
.cppファイルにインクルードガードを入れる必要がありますか? – kingcobra1986