2012-04-16 18 views
0

私は、次のファイルを持っている:C++ヘッダーとソースディレクトリ

listDriverTest.cpp 
src/List.cpp 
headers/List.h 

ザ・はList.cppに含めるザ・はlistDriverTest.cppに含める

#include "../headers/List.h" 

#include "headers/List.h" 

です次の文でコンパイルします。

g++ listDriverTest.cpp "src/List.cpp" 

「定義されていない参照」エラーがかなり発生します。

listDriverTest.cpp:(.text+0x81): undefined reference to `List<int>::List()' 
listDriverTest.cpp:(.text+0x8f): undefined reference to `List<int>::add(int)' 
listDriverTest.cpp:(.text+0x9d): undefined reference to `List<int>::add(int)' 
... 

どのように適切に含んで使用してコンパイルが適切に機能するためには、これらの3つのファイルをコンパイルする必要がありますか?私はlistDriverTest.cppをコンパイルし、同じディレクトリ内のすべてのファイルで正しく実行するようにしましたが、このように分割されていないときは正しくありません。

+0

list.hヘッダーを見つけることができないという非常に具体的なエラーが表示されないことに驚いています。 –

+1

テンプレートを使って作業するときは、ヘッダファイルにすべてを定義する必要があります。http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13 –

+0

*未定義のリファレンス*はリンカのエラーです。ヘッダ/ソースの場所とは関係ありません。 –

答えて

1

私の答えはMust a child of a template class also be a template class?です。

おそらく別の質問ですが、同じ回答が適用されます。

+0

ああ、ありがとう。私は完全に/クラスに属するテンプレートメソッドのヘッダーファイルとcppファイルを持つ問題について忘れてしまった。それはすぐに問題を解決しました! – Tanaki

0

あなたのプログラムは私のマシン上で正しくコンパイルされています。
src/List.cppの二重引用符を削除するだけです。 あなたの問題は他のものだと思います。

"list"を出力したlist.cppに関数void list(void)を追加しました。
同じ署名がlist.hに追加されました。

1

src/List.cppをコンパイルして生成されたオブジェクトファイルは、すでに特殊化リストを含んでいるようですが、listDriversTest.cppのオブジェクトファイルとは別のディレクトリにあります。したがって、リンカーはそれを見つけることができません。

もちろん、これはテンプレートコードの構成方法によって異なります。