1

コード 1 :

template <class T>
class cat{
public:
       T a;
       void show(){
       cout << a ;
       }
};

コード 2 :

template <class T>
class dog{
public:
       T a;
       template <class U> // making show function template
       void show(){
       cout << a ;
       }
};


cat::show()テンプレート クラスのメンバ関数も同様です 。
テンプレートクラスのdog::show()メンバ関数テンプレートです。

質問:
1)メンバー関数 show を呼び出すときではなく、クラス テンプレートの cat と dog に違いはありますか?
2)コンパイラはそれらを同じように処理しますか。たとえば、 cat::show() は使用するまでコンパイルされません。そして、dog::show(); についても同じことが言えると思います。ここに欠けているものはありますか?

4

1 に答える 1

1

これらの2つは、2つの無料関数fooがここで関連しているのと同じ方法でのみ関連しています。

void foo() {};
template <typename T>
void foo() {}

テンプレートクラスのメンバーである間、両方とも暗黙のインスタンス化の要求に応じてインスタンス化されます。一方、テンプレートクラスを明示的にインスタンス化すると、非テンプレート関数はコンパイラによって生成されますが、テンプレートメンバー関数は生成されません。

それとは別に、通常の警告:テンプレート関数は正確な型にのみ一致しますが、非テンプレート関数は暗黙的な変換を許可します。

template <typename T>
struct tmpl {
   void foo( T, T ) {}
   template <typename U>
   void bar( U, U ) {}
};
tmpl<int> t;
t.foo( 5, 1. );    // fine, will convert 1. from double to int
t.bar( 5, 1. );    // error

そして、テンプレート化された関数とテンプレート化されていない関数の間の他のすべての違い。


私が本当に理解していないのは、なぜこれがあなたをとても混乱させているのかということです。インスタンス化を関数の唯一のプロパティと見なしているようですが、そうではありません。本当に気になるのは何ですか?テンプレート関数と非テンプレート関数が同じになるのはなぜだと思いますか?

特に、実装の詳細に多くの労力を費やしていると思います。ほとんどの場合、テンプレートクラスの1つまたはすべてのメンバー関数がインスタンス化されるかどうかは、プログラムのセマンティクスに実際には影響しません。プログラムにメンバー関数が必要な場合、プログラムがメンバー関数を必要としない場合は、コンパイラがそのコードを生成します。 、コードを生成したかどうかに違いはありません(リンカが任意のシンボルを削除できること、生成されていないメンバー関数とリンカによって削除されたメンバー関数の違いは何ですか?)

于 2012-06-30T01:55:35.267 に答える