1

この Java コードを C++ で実装する方法を教えてもらえますか?

  public class MyClass<T extends OtherClass>{
    ....
  }

これを C++ でテストしました。

 template<class T, class OtherClass>
 class MyClass
 {
    public:
          MyClass();
  }

しかし、私はエラーが発生しました:invalid use of template-name 'MyClass' without an argument list

ご挨拶

4

3 に答える 3

6

std::is_base_of次のものと組み合わせて使用​​できますstatic_assert

template<class T>
class MyClass
{
    static_assert( std::is_base_of< OtherClass, T >::value, "T does not extend OtherClass");

public:
    MyClass();
};

(もちろん、OtherClassより柔軟にする必要がある場合は、追加のテンプレート パラメータを作成することもできます)

于 2013-09-24T15:08:21.353 に答える
1

通常、C++ では次のように使用します。

template<class T>
class MyClass

などと言う必要はありませんextends OtherClass

説明は次のとおりです。

C++ と Java の両方で、オブジェクトのメソッドまたはフィールドにアクセスする場合、コンパイラは、オブジェクト式の静的型がそのメソッドまたはフィールドをサポートしていることを確認する必要があります。そうしないと、コンパイルに失敗します。

Java では、ジェネリック クラスとメソッドは一度だけコンパイルされます。ジェネリック クラスまたはメソッドがコンパイルされると、型パラメーター ( などT) が何であるか、またはその可能性があるかは不明です。したがって、 によって提供されていないメソッドやフィールドにコンパイラがアクセスできるようにするには、境界が必要Objectです。境界を持つ理由は、 のT extends OtherClassどこかで、によって提供されるMyClassタイプ の式のメソッドまたはフィールドにアクセスしようとするためです。したがって、この境界により、コンパイラは型チェックを行い、正常にコンパイルできます。TOtherClass

対照的に、C++ では、テンプレート化されたクラスとメソッドは、コンパイラがテンプレート コードのコピーをコピーして貼り付け、それぞれを実際の型引数に置き換えるかのように、異なる型引数 (テンプレートの各 "インスタンス化" と呼ばれます) ごとに 1 回コンパイルされます。Tコードでの発生。したがって、テンプレート化されたクラスまたはメソッドがコンパイルされると、型Tが何であるかが正確にわかります。Tコンパイラは、指定されたメソッドまたはフィールドをサポートする型を直接チェックできるため、Java のような境界の指定は不要です。Tが のサブタイプである場合OtherClass、正常にコンパイルされます。Tのサブタイプでない場合OtherClass、その名前のメソッドまたはフィールドがない可能性があり、あったとしても、適切なタイプがない可能性があるため、コンパイルに失敗する可能性があります。基本的にダックタイピングです。

(可能性は低いですが、 のサブタイプではない別の無関係な型があり、で使用されているOtherClassものと同じ名前と型のメソッドとフィールドを持っている可能性があります。その型を使用しても、コンパイラはそれについて文句を言うことはありません. ただし、そのような型が存在するのはおそらく悪い設計であり、誤ってそのような型を間違った場所で使用することはほとんどありません.)OtherClassMyClassMyClass

于 2013-09-26T08:38:28.017 に答える
1

テンプレート化されたクラス (つまり、 で行ったことtemplate<class T, class OtherClass>) を宣言する場合は、宣言したテンプレートを使用する必要があります。TorOtherClassを使用しなかったMyClassため、コンパイラ エラーが発生します。

C++ での実装方法についてはT extends OtherClass、C++ には多重継承があるため単純ではありませんが、is_base_of関数を使用することができますstl

于 2013-09-24T15:08:26.140 に答える