0

私は C++ に比較的慣れていないので、私の質問には簡単な答えがあるかもしれません。ただし、コードが機能すると思っていたのになぜ機能しないのかわかりません。サンプルコードは以下の通りです。


//a.h
#ifndef A
#define A

template<class T>
class a{
public:
    a();
private:
    T str;
};

#include "a.cpp"
#endif

//a.cpp

//#ifdef A
#include "a.h"
using namespace std;

template<class T>
a<T>::a(){
    str = 'a';
}

//#endif

//driver.cpp
#include"a.h"
#include <string>
using namespace std;

void main(){
    a<string> object;
}

テンプレートを含めるときにエラーを回避する方法について、オンラインで情報を読んでいます。その 1 つは、私がここで達成しようとしていること#include "a.cpp"ですa.h。ただし、私が調べたサンプルでは、​​サンプル コードに示されているをまだ使用#include "a.h"しています。a.cppただし、function template has already been definedエラーが発生しています。a.cppで を使用して#ifdef Aコメントアウト#include "a.h"すると、この再定義エラーを取り除くのに役立つことがわかりました。しかし、私は何が起こっているのかを理解したいと思っています。のインクルードガードによって再定義がすでに処理されているはずではありませんa.hか?

4

2 に答える 2

0

これは、テンプレートの実装をテンプレートの宣言から分離する方法ではありません。.cpp ファイルを .h ファイルに含めません。代わりに、.cpp ファイルをプロジェクト ファイルまたは make ファイルに追加するだけで、他のファイルと同様にコンパイルされます。次に、明示的なテンプレートのインスタンス化を使用して、リンク エラーを回避します。

于 2014-10-01T01:36:35.173 に答える