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

テンプレート引数としての局所型

テンプレートインスタンス化の仕組みは、型と名前が一致することを目安に、どのテンプレートをインスタンス化または再インスタンス化する必要があるかを決定します。したがって、局所型がテンプレート引数として使用された場合には重大な問題が発生する可能性があります。自分のコードに同様の問題が生じないように注意してください。次に例を示します。


array.h       template <class Type> class Array {
                      Type* data;
                      int   size;
                  public:
                      Array( int sz );
                      int GetSize( );
              };

array.cc       template <class Type> Array<Type>::Array( int sz )
                  { size = sz; data = new Type[size]; }
              template <class Type> int Array<Type>::GetSize( )
                  { return size;}

file1.cc      #include "array.h"
              struct Foo { int data; };
              Array<Foo> File1Data;

file2.cc      #include "array.h"
              struct Foo { double data; };
              Array<Foo> File2Data;

file1.cc の中に登録された Foo 型は、file2.cc の中に登録された Foo 型と同じではありません。局所型をこのように使用すると、エラーと予期しない結果を生じることがあります。