のメンバーの使用上の仮想の影響Iは(漠然と)がないがを使用する場合は、テンプレートがインスタンス化されていないことを知っています。たとえば、T = int
の場合、T::type
が意味を成さないにもかかわらず、次のコードは正常にコンパイルされます。クラステンプレート
template<typename T>
struct A
{
void f() { using type = typename T::type; }
};
A<int> a; //ok
f()
はないがを使用しているので、—は、このようにT::type
の妥当性がチェックされないままにインスタンス化されていないので、それがコンパイルされます。 メンバーの機能がg()
の場合はf()
としても問題ありません。
template<typename T>
struct A
{
void f() { using type = typename T::type; }
void g() { f(); } //Is f() still unused?
};
A<int> a; //ok
これもcompile finesです。しかし、ここで私は"使用"の定義の私の理解のあいまいさを実現します。私は尋ねます:
f()
は未使用ですか?どのくらい正確に?
g()
の中ではっきりとわかります。しかし、私はg()
が使用されていないので、f()
もインスタンス化の観点からは使用されていないと考えました。それは十分に妥当と思われる。これまでのところ。私はg()
にvirtual
キーワードを追加する場合
しかし、それはコンパイルされません。今ではf()
をインスタンス化しようとするので、それがcompilation errorになり
template<typename T>
struct A
{
void f() { using type = typename T::type; }
virtual void g() { f(); } //Now f() is used? How exactly?
};
A<int> a; //error
。私はこの行動を理解していません。
誰でもこれを説明できますか?特に、virtual
キーワードの影響は、クラステンプレートのメンバーの "使用"の定義に影響します。
私が正しく思い出すと、 'virtual'は、この関数が使用されるかどうかを静的に評価することはほとんど不可能なので、メンバー関数のインスタンス化を強制します。実際には、関数へのポインタでいっぱいのvテーブルを作成するように求めています。関数へのポインタが必要なので関数が必要です。 –
構造体テンプレートは、使用時にのみインスタンス化されます。これは構造体全体か何もありません。それはgやfとは関係がありません。 – Sarien
@Sarien:テンプレートクラスのメンバー関数は、ODRが使用されている場合にのみインスタンス化されます。 –