5

そのため、一緒にコンパイルしたいファイルがいくつかあります。それらの 1 つは、stack.cpp が含まれている stack.h です。

以下は私のヘッダーファイルです:

#include<iostream>
#ifndef STACK_H
#define STACK_H 
template <class ItemType>
class StackType
{
public:
    //code

private:
    //code   
};
#include "stack.cpp"
#endif

以下は、stack.cpp です。

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

template<class ItemType>
StackType<ItemType>::StackType(){
    top = -1;
    MAX_ITEMS = 200;
}

//other codes
}

作成すると、stack.cpp のコードを再定義していると表示されます

以下は私のMakefileです:

main.o: main.cpp stack.h
    g++ $(CFLAGS) -c -o main.o main.cpp
stack.o: stack.cpp stack.h
    g++ $(CFLAGS) -c -o stack.o stack.cpp

問題が何であるかわかりません。

4

2 に答える 2

9

をコンパイルしようとしないでくださいstack.o。これは、クライアント コードに含める必要があり、ビルドできないテンプレート コードです。stack.cpp依存関係をルールに追加するだけですmain.o(main.cpp に が含まれていると仮定して、ルールstack.hを削除しstack.oます:

main.o: main.cpp stack.h stack.cpp
    g++ $(CFLAGS) -c -o main.o main.cpp

さらに問題があります。それは、に含めることstack.hstack.cppあり、その逆も同様です。#include stack.hからを削除する必要がありstack.cppます。

テンプレート コードは単独でコンパイルするべきではないため、 のサフィックスstack.cpp.icpp.

于 2012-12-09T21:27:19.623 に答える
2

テンプレートであっても、インターフェイスと実装を分離するという考えは、立派な立場です。ただし、テンプレート実装ファイルを .cpp ファイルと呼ばないことをお勧めします。この場合、Boost は ipp を使用します。

あなたはそれを含めることで正しいことをしましたが、それをコンパイルすることで間違ったことをしました....cppはあなたがすべきことを示します。

于 2012-12-09T21:30:13.890 に答える