2012-03-10 9 views
0

私のCSデータ構造クラスでは、リンクリストを使用して汎用スタックを実装しています。しかし、自分の.cppファイル内のすべてのコンストラクタと関数に対して、 "Redefinition of ...."エラーが発生しています。インストラクターによって "Stach.h"というヘッダファイルが与えられ、最後に "Stack.cpp"が含まれていました。私はその行をコメントアウトするとすべてうまく動作しますが、彼女はそれを望みます。 誰もこれについて聞いたことがありますか?ヘッダーファイルの再定義エラーに.cppを含める - 一般的なスタックの実装

みんなありがとう、

デビッド

+4

からStach.cppを削除しますか?かなり厄介な... – mfontanini

+0

彼女はあなたにビルドの指示をくれましたか? – moooeeeep

+0

さて、stack.cppとstack.hを見てみましょう。ヘッダーファイルに.cppファイルを含めることは珍しいことです。ビルドが中断された場合、私はあなたと教授がうまくやり取りしていないと考えています。 –

答えて

1

.cppファイルを含む唯一の時間は、.cppファイルにテンプレートの実装を入れて、エディタでCの代わりにC++と認識できるようにするときです。スタックの実装はテンプレートですか?

もしそうなら、テンプレートメソッドの実装は、それを使用しているコンパイルユニットで使用可能でなければなりません。ヘッダそのもの以外に実装する場合は、通常.ippまたは.tccテンプレートの実装ファイルに使用します。これはBoostと他の数多くのライブラリが行うことです。この場合、stack.cppをコンパイルするべきではありません。これは、クライアントまたはドライバプログラムがヘッダファイルを含むときコンパイラがそれを処理するからです。

+0

ありがとうございました。私はxcodeを使用していたので、すべてを一緒にコンパイルする必要がありました。私は、ヘッダファイルを含むmainをコンパイルするだけでターミナルを使って走らせました。 – dajee

2

あなたのインストラクターが間違っています。ヘッダーファイルには、cppファイルは含まれません。

コンパイラは、ヘッダーが含まれているすべての場所で処理します。ヘッダーをファイルに含めると、cppファイルに実装されているすべての機能がその変換単位に定義されます。複数の場所に含めると、複数の翻訳単位に同じシンボルが含まれているため、言及したリンカーエラーが発生します。

実装がinlineと宣言されていても、それでも問題はありません。

EDIT:クラスがどのようにテンプレートであるかを見て、私は1つの問題は同じ型に2回専門化していると考えることができます。コンパイルからcppファイルを削除しますが、可能であれば実際に拡張子をimplなどに変更する必要があります。そうすれば、コンパイラは個別にコンパイルすることはありませんが、クラスを特化したファイルでもコンパイラを使用できます。

+0

テンプレートがどのように実装されているかを考えてください。通常は.cppファイルではなく '.tcc'または' .ipp'ファイルですが、同じコンセプト –

+0

@ D.Shawleyでは全く同じ概念ではありません。テンプレートは、特殊化された場合にのみシンボルを生成します。 –

+0

私はそれが意味をなさない場合を見た。例えば、あなたが使用する必要がある関数があり、それが.. \ foo \ foo.cppにあるとしますが、それは何らかの理由で.libとして構築することはできません(例えば、32ビットとしてしか構築されず、必要64)。ヘッダーファイルfoo.hは、単に "#include <.. \ foo \ foo.cpp>"を実行するだけです。このようなケースはまれですが、それは完全に正当な解決策です。それらのケースでは –

0

理由:Stach.hファイルにStach.cファイルをインクルードするには、プリプロセッサの#includeディレクティブを使用します。これは、Stach.cファイルのコードをStach.hファイルにコピーします。
おそらくあなたのコマンド内のCMakeLists.txtファイル< <(SOURCE_FILES ..)>>また、Stach.hとStach.cppファイルの両方をリンクします。
したがって、Stach.cppのコードはStach.hとStach.cppに存在するため、リンカーは再定義が存在することを通知します。
クイックフィックス:Stach.anotherExtensionへStach.cppの変更ファイル名(:)以前のコメントを参照してください)
BestFix:ソースファイルを含むCMakeLists.txt

関連する問題