コンパイルされない次のコードがあります。インターフェイスオブジェクトを持つC++テンプレート
class Base {
public:
virtual ~Base() { };
};
class Derived : public Base { };
class NotDerived { };
template <typename T>
class Group { };
int main() {
Group<Base> *g = NULL;
g = new Group<Base>(); // Works
g = new Group<Derived>(); // Error, but I want it to work
g = new Group<NotDerived>(); // Error, as expected
}
私はg
がGroup<Derived>
とは異なるタイプであるため、これはコンパイルされませんことを理解しています。 Javaでこの作業を行うには、Group<? extends Base> g
などの処理を行いますが、C++にはわかっている限り、そのキーワードはありません。何ができますか?
編集:Base
から派生しないタイプをg
として設定したくないということを明確にしたいと思います。私はこれを説明するために私の例を更新しました。
編集2:私の問題は2つの解決策があります。 Dave's私は単純で簡単に定義することができました。しかし、Bowie's(加えてMark'sの追加)が私のニーズに適していました。
私はこの種のことがJavaでどのように機能するかに慣れていません。あなたはその構文で何を言おうとしていますか? –
これはJavaでも動作しません。 '<? extends ...> 'は共分散をサポートするためのものではありませんが、ジェネリックがどのタイプを使用するかという制約を加えることができます。 –
[C++ template polymorphism](http://stackoverflow.com/questions/2203388/c-templates-polymorphism) – Praetorian