テンプレート使用時の分割コンパイルについて
Posted: 2010年9月29日(水) 18:23
いつもお世話になります。
今コツコツとクラスやテンプレートの勉強をしているのですが、
テンプレートを使用した時の分割コンパイルがうまくいきません。
具体的には「未定義のシンボル」というエラーが出ます。
おそらく該当の関数の定義が見えていないのだと思われるのですが、
どのような定義にすれば、分割コンパイルが可能にあるのでしょうか?
そもそも、テンプレートを使った場合は、分割コンパイルは無理で、
ヘッダファイルに定義部分までを全て書くしかないのでしょうか?
例を書きます。
まず下記の関数テンプレートを持った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で渡している型には絶対間違いはありません
このテンプレート関数の定義自体をヘッダファイルに全部書いてしまえば、コンパイルは通るのですが、
インライン展開されてしまうことや、ヘッダ部分に書くのはコードも長いので、出来れば分割コンパイルに
したいと思っています。
分割コンパイルの方法をご存知の方がいらっしゃいましたら、ご教示願います。
今コツコツとクラスやテンプレートの勉強をしているのですが、
テンプレートを使用した時の分割コンパイルがうまくいきません。
具体的には「未定義のシンボル」というエラーが出ます。
おそらく該当の関数の定義が見えていないのだと思われるのですが、
どのような定義にすれば、分割コンパイルが可能にあるのでしょうか?
そもそも、テンプレートを使った場合は、分割コンパイルは無理で、
ヘッダファイルに定義部分までを全て書くしかないのでしょうか?
例を書きます。
まず下記の関数テンプレートを持った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で渡している型には絶対間違いはありません
このテンプレート関数の定義自体をヘッダファイルに全部書いてしまえば、コンパイルは通るのですが、
インライン展開されてしまうことや、ヘッダ部分に書くのはコードも長いので、出来れば分割コンパイルに
したいと思っています。
分割コンパイルの方法をご存知の方がいらっしゃいましたら、ご教示願います。