C++ プログラミングガイド

非局所型名前の解決とインスタンス化

テンプレート定義で使用される名前の中には、テンプレート引数によって、またはそのテンプレート内で、定義されていないものがある可能性があります。そのような場合にはコンパイラが、定義の時点で、またはインスタンス化の時点で、テンプレートを取り囲むスコープから名前を解決します。1 つの名前が複数の場所で異なる意味を持つために解決の形式が異なることも考えられます。

名前の解決は複雑です。したがって、汎用性の高い標準的な環境で提供されているもの以外は、非局所型名前に依存することは避ける必要があります。言い換えれば、至るところで宣言されていて、どこでも同じ意味をもつ非局所型名前だけを使用するようにしてください。この例では、テンプレート関数の converter が、非局所型名前である intermediary と temporary を使用しています。これらの名前は use1.ccuse2.cc では異なる定義を持っているため、コンパイラが異なれば結果は違うものになるでしょう。テンプレートが正しく機能するためには、すべての非局所型名前 (intermediary と temporary) がどこでも同じ定義を持つ必要があります。


use_common.h   // 共通のテンプレート定義
               template <class Source, class Target>
               Target converter( Source source )
                      { temporary = (intermediary)source; 
                      return (Target)temporary; }

use1.cc        typedef int intermediary;
               int temporary;

               #include "use_common.h"}

use2.cc        typedef double intermediary;
               unsigned int temporary;

               #include "use_common.h"

非局所型名前を使用する典型的な例として、1 つのテンプレート内で cin と cout のストリームの使用があります。ほとんどのプログラマは実際、ストリームをテンプレートパラメータとして渡すことは望まないので、一つの大域変数を参照するようにします。しかし、cin および cout はどこでも同じ定義を持っていなければなりません。