自作テンプレートクラスのLNK2019

解決


moe  2006-10-17 17:39:36  No: 63351  IP: 192.*.*.*

自作テンプレートクラスを作成してビルドしたら
リンカエラーerror LNK2019って出てきちゃいました。
テンプレートクラスのヘッダーファイル内で宣言と定義を書き、
使用するクラスのソースファイルでそのヘッダーをインクルード
してるのですが、何か問題があるのでしょうか?
よろしくお願いいたします。

編集 削除
επιστημη  2006-10-17 19:35:17  No: 63352  IP: 192.*.*.*

未解決のシンボルがあります。

呼んでいるのに定義されていない関数/変数があるのでしょう。

編集 削除
yoh2  2006-10-18 01:02:31  No: 63353  IP: 192.*.*.*

エラー情報からは、何が定義されていなかったかも分かるので、その定義を確認しましょう。

テンプレートクラスの静的メンバ変数の定義は結構忘れがちですが大丈夫でしょうか?

template<typename T> struct A{
    static int n;
};

template<typename T> struct A<T>::n;  // これを忘れると……

...

    A<int>::n = 10;  // これでリンクエラー。

特殊化をしているとさらに忘れがち。

template<> struct A<double>{
    static int n;
};

int A<double>::n;  // 上記の int A<T>::n が定義されていてもこれが必要。

編集 削除
moe  2006-10-18 12:05:21  No: 63354  IP: 192.*.*.*

yoh2さんのおっしゃってること、その通りでした。
ありがとうございます。
ところで、テンプレートクラスのスタティック関数については
ソースファイルに定義しても大丈夫なのですよね?
なぜ、テンプレートクラスだとヘッダー部分に定義しなければ
いけないかがよくわかってないのですが。。

編集 削除
keichan  2006-10-18 13:51:57  No: 63355  IP: 192.*.*.*

つ「http://www.tietew.jp/cppll/archive/2596

編集 削除
moe  2006-10-19 15:03:09  No: 63356  IP: 192.*.*.*

keichanさん、どうもありがとう。
すごく納得しました。
が、複雑なんですね。。

編集 削除