opt は次のいずれかの値である必要があります。
表 A–21 -template の値
値 |
意味 |
---|---|
[no%]extdef |
別のソースファイルからテンプレート定義を検索します [しません]。 |
[no%]geninlinefuncs |
明示的にインスタンス化されたクラステンプレートのための非参照インラインメンバー関数を生成します [しません]。 |
[no%]wholeclass |
コンパイラに対し、使用されている関数だけインスタンス化するのではなく、テンプレートクラス全体をインスタンス化する [しない] ように指示します。クラスの少なくとも 1 つのメンバーを参照しなければいけません。そうでない場合は、コンパイラはそのクラスのどのメンバーもインスタンス化しません。 |
-template オプションを指定しないと、-template=no%wholeclass,extdef が使用されます。
次のコードについて考えてみましょう。
example% cat Example.cc template <class T> struct S { void imf() {} static void smf() {} }; template class S <int>; int main() { } example% |
-template=geninlinefuncs を指定した場合、S の 2 つのメンバー関数は、プログラム内で呼び出されなくてもオブジェクトファイルに生成されます。
example% CC -c -template=geninlinefuncs Example.cc example% nm -C Example.o Example.o: [Index] Value Size Type Bind Other Shndx Name [5] 0 0 NOTY GLOB 0 ABS __fsr_init_value [1] 0 0 FILE LOCL 0 ABS b.c [4] 16 32 FUNC GLOB 0 2 main [3] 104 24 FUNC LOCL 0 2 void S<int>::imf() [__1cBS4Ci_Dimf6M_v_] [2] 64 20 FUNC LOCL 0 2 void S<int>::smf() [__1cBS4Ci_Dsmf6F_v_] |