- ベストアンサー
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:};
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
test1.cpp のコンパイル時、template引数 T が確定していないので コードが生成できないのです。
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。 了解です。使われる(テンプレート引数が確定する)時点で定義(実装)が存在しないとコンパイルできないからです。 # inline とは意味合いが違いますけども。
お礼
理解できました。ありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> #include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。 何言ってるのかわかりません。
お礼
stlのVc7\include\vectorファイルのことですが 下記のように書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。 template<class ***> class vector<***,***> {***};
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず, 「きちんとコンパイルできるプログラム」を例に挙げるようお願いします. といっておくけど, template の場合は「必要なものが必要なところで見えないとエラーになる可能性が高い」んだよね. ある意味では inline と同じようなものか?
お礼
ご回答ありがとうございます。 確かにinlineはclassとかで不用意に書くとエラーが出ますね。
お礼
ご回答ありがとうございます。 #include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。