テンプレート使用時の分割コンパイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シエル

テンプレート使用時の分割コンパイルについて

#1

投稿記事 by シエル » 15年前

いつもお世話になります。

今コツコツとクラスやテンプレートの勉強をしているのですが、
テンプレートを使用した時の分割コンパイルがうまくいきません。

具体的には「未定義のシンボル」というエラーが出ます。
おそらく該当の関数の定義が見えていないのだと思われるのですが、
どのような定義にすれば、分割コンパイルが可能にあるのでしょうか?
そもそも、テンプレートを使った場合は、分割コンパイルは無理で、
ヘッダファイルに定義部分までを全て書くしかないのでしょうか?

例を書きます。
まず下記の関数テンプレートを持ったBASEというクラスがあります。
これをBase.hというヘッダファイルに書きます。

class BASE{
protected:
template <typename T1> void SetList(T1 p,LIST<T1> header);
};

でこれをインクルードしたBase.cppというファイルがあり、その中で
この関数テンプレートの定義を行っています。
template <typename T1> void BASE::SetList(T1 p,LIST<T1> header)
{
※省略
}

さらにこのクラスを継承したAというクラスがあります。
class A : public BASE{
A();
};

例えばこの関数のコンストラクタで
A::A()
{
SetList(func,head);
}
という風に呼び出しても、未定義のシンボルというエラーが出ます。
明示的な型の具現化をしても一緒です。
※SetListで渡している型には絶対間違いはありません

このテンプレート関数の定義自体をヘッダファイルに全部書いてしまえば、コンパイルは通るのですが、
インライン展開されてしまうことや、ヘッダ部分に書くのはコードも長いので、出来れば分割コンパイルに
したいと思っています。

分割コンパイルの方法をご存知の方がいらっしゃいましたら、ご教示願います。

Poco

Re:テンプレート使用時の分割コンパイルについて

#2

投稿記事 by Poco » 15年前

export指定をサポートしているコンパイラなら分離コンパイル可能です。
VC++は(多分)サポートしていません。
というか、私自身サポートしているコンパイラを見たことありません
(製品名を忘れましたが、存在するのは知っています)。

基本的にテンプレートの定義はヘッダファイルに押し込めたほうが良いと思いますよ。 画像

シエル

Re:テンプレート使用時の分割コンパイルについて

#3

投稿記事 by シエル » 15年前

export指定というものをサポートしてないと出来ないんですね。

仕方ないですが、ヘッダに全部書くことにします。

ぽこさん、ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る