template関数は、実際に呼ばれない限り一切オブジェクトコード化されない?

[戻る]
しん 2007/03/30(金) 19:38:52
template関数やクラスは、定義したとしても
実際に使われない限り一切オブジェクトコード化されないと思って宜しいでしょうか?
( C++の言語仕様上 )

ある組み込み環境のg++ Ver4で実験したらそのようになりましたが、
他の環境でもそうかな?と思い、質問させて頂きました。

どうぞ宜しくお願い致します。

επιστημη [HomePage] 2007/03/30(金) 19:53:00
使われなければtemplate引数が定まらんのだからオブジェクトの吐きようがありませ
ん。

しん 2007/03/30(金) 20:00:02
[[解決]]
言われてみれば確かに。。。。お粗末様でした。


どうも有難うございました!

yoh2 [E-Mail] 2007/03/30(金) 21:13:32
明示的なインスタンス化というものもあります。
以下の例では、func<int>(const int &)の他、一度も呼ばれていない
func<double>(const double &)のコードも生成されます。
ただし、最適化によって消える可能性はあります。

    template<typename T> void func(const T &x)
    {
    }

    // 明示的なインスタンス化
    template void func<double>(const double &x);

    int main()
    {
        func(10);   // テンプレート関数の呼び出しは暗黙的なインスタンス化
        return 0;
    }

reshia 2007/04/02(月) 22:59:41
# 解決済みですが・・
あらかじめexportをつけておけば(宣言時ではなく、定義時に)、
オブジェクトコードにテンプレートが含められるとか・・。

ただし、exportをサポートしているコンパイラは・・
いまのところほとんどありません。


「C++プライマー」に詳しく書いてあります。
http://www.amazon.co.jp/dp/4798109924/

古いスレッドには追加発言できません。