は私のようなテンプレートクラスを持っていると仮定しますクラスは、等価演算子を定義していないにもかかわらず:仮想関数やジェネリックプログラミング
int main(int argc, char* argv[])
{
A a;
Foo<A> foo(a);
return 0;
}
しかし、私ははFooを作る場合は::バー()仮想:
virtual bool Bar(const T& value)
{
return m_Value == value;
}
コードはもはやコンパイル:
エラーC2676:バイナリ '==': 'A' は、この演算子を定義していないがまたは定義済みのオペレータが受け入れ可能なタイプへの変換
これはなぜ問題なのかを完全に理解しています。私が間違っている場合は私を修正しますが、私の理解は、関数が仮想であるため、Fooのvテーブルでそれを参照できるように、関数をコンパイルする必要があります(呼び出されなくても)。
この問題を回避する方法があるのでしょうか。部分的なインターフェイスだけを実装できるジェネリック型を扱うテンプレートクラスを用意したいと思います。欠落しているビットが使用されていない限り、コードは正常にコンパイルする必要があります。これは、STDコンテナの多くがすでにどのように動作しているかに似ていますが、仮想関数は使用していません。
どうすればよいですか?これに優雅な解決策はありますか?
関数が仮想の場合は、関数を定義してコンパイルする必要があります。これは基本的なことです。 –
クラステンプレートの非仮想メンバ関数は、それ自体が関数テンプレートであり、最初に使用されたときにのみインスタンス化されます。対照的に、仮想メンバ関数は、クラステンプレートの特殊化インスタンス化の一部として常にインスタンス化されます。 –
クラステンプレートがインスタンス化されるとき、メンバー関数の*宣言のみがコンパイルされ、ボディは宣言されません。また、仮想非純粋メンバ関数は常にodr-usedであり、クラステンプレートインスタンス化の一部として完全にコンパイルされます。 – 0x499602D2