0

重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
テンプレートクラスの実装と宣言を同じヘッダーファイルに含める必要があるのはなぜですか?

データを保存するために「スタック」が必要なプロジェクトに取り組んでいます。しかし、ファイルタイプごとに異なるバージョンをコーディングしたくありません(そしてベクターを使用したくありません)。

だから私はテンプレートクラスを使おうとしています、そしてこれは私のコードです:

StructStack.h

#ifndef STRUCTSTACK_H_
#define STRUCTSTACK_H_

template <class AnyType> class StructStack {
    StructStack();
    ~StructStack();
    struct Element {
        Element *pointer;
        AnyType value;
    };
    Element *pointerToLastElement;
    int stackSize;
    int pop();
    void push(int value);
    int size();
};

#endif

StructStack.cpp

#include "stdafx.h"
#include "StructStack.h"
#include <iostream>
using namespace std;


template <class AnyType> void StructStack<AnyType>::StructStack() {
    //code
}

template <class AnyType> void StructStack<AnyType>::~StructStack() {
    //code
}

template <class AnyType> AnyType StructStack<AnyType>::pop() {
    //code
}

template <class AnyType> void StructStack<AnyType>::push(AnyType value){
    //code
}

template <class AnyType> AnyType StructStack<AnyType>::size() {
    //code
}

これらの2つのファイルをコンパイルしようとすると、コンパイルエラーが大量に発生します。複数ファイルのプロジェクトでテンプレートクラスを作成するのはちょっと難しいとオンラインで読んだ。

では、これはどのように行うことができますか?

4

4 に答える 4

2

関数の定義をヘッダーファイル内に配置する必要があります。あなたが中に書いたものはすべて、クラス定義の後に入るStructStack.cppはずです。StructStack.h

于 2012-11-07T11:48:49.257 に答える
2

これを解決するには、すべての定義(現在使用しているコードStructStack.cpp)をに入れStructStack.h、前者を削除します。コンパイラは、必要に応じてクラステンプレートをインスタンス化できるように、実装コードにアクセスできる必要があります。

于 2012-11-07T11:49:05.823 に答える
1

テンプレート化されたコードは、それを使用する必要のあるすべてのファイルファイルで確認する必要があります。

特殊化または使用されるまでコンパイルされません。

基本的に、別のファイルで使用する場合は、ヘッダーファイルに入れてからインクルードする必要があります。特定のタイプのテンプレートを実際に使用すると、コードは使用されているコンテキストで生成されます。

于 2012-11-07T11:50:01.057 に答える
0

C ++テンプレートコードは常にヘッダーファイルに配置する必要があります。これにより、テンプレートをインスタンス化するすべての変換ユニットで実装が表示されます。必要に応じて、コードを*.hファイルと*.cppファイルに分けることができますが、*。hファイルの最後に*.cppファイルを含める必要があります。

于 2012-11-07T11:53:12.183 に答える