• ベストアンサー

templateの抽象クラスについて

VC++2003の環境なんですが、 下記の状態でtest2.a()を呼び出すと未解決の外部シンボル(LNK2019)のエラーが発生します。同じファイルでこれらを定義した場合は普通に通りました。class内で定義した場合も通ります。なぜでしょうか? test1.h : template<class T> class test1 { public: void a(); }; test1.cpp : template <class T> void test1<T>::a(){} test2.cpp : class test2 : public test1<int> {public:};

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

test1.cpp のコンパイル時、template引数 T が確定していないので コードが生成できないのです。

msms001999
質問者

お礼

ご回答ありがとうございます。 #include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。

その他の回答 (3)

回答No.4

> 書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。 了解です。使われる(テンプレート引数が確定する)時点で定義(実装)が存在しないとコンパイルできないからです。 # inline とは意味合いが違いますけども。

msms001999
質問者

お礼

理解できました。ありがとうございます。

回答No.3

> #include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。 何言ってるのかわかりません。

msms001999
質問者

お礼

stlのVc7\include\vectorファイルのことですが 下記のように書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。 template<class ***> class vector<***,***> {***};

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

とりあえず, 「きちんとコンパイルできるプログラム」を例に挙げるようお願いします. といっておくけど, template の場合は「必要なものが必要なところで見えないとエラーになる可能性が高い」んだよね. ある意味では inline と同じようなものか?

msms001999
質問者

お礼

ご回答ありがとうございます。 確かにinlineはclassとかで不用意に書くとエラーが出ますね。

関連するQ&A