私はC++とDelphiを比較していました。Delphiのネストされたクラス
これは非常に簡単なC++コードです。このシナリオでは
template<typename T>
class C {
class D {
T x;
}
}
、私たちはクラスC
はテンプレートクラス(=ジェネリッククラス)で、ネストされたクラスD
もテンプレートクラスであることを持っています。 T
がdouble
である場合、の中のx
はdouble
です。
私はこれを言うことができない:私はすでにC
「内部」だと、別のT
が競合になるので、
template<typename T>
class C {
template<typename T>
class D {
T x;
}
}
エラーであること。エラーを修正するには、U
のような別の名前を使用する必要があります。
template<typename T>
class C {
template<typename U>
class D {
T x;
}
}
Delphiでは、私はこれを書くことができる:T
はx
は以来integer
ある今、integer
ある
type
TClassC<T> = class
private
type
TClassD = class
private
x: T;
end;
end;
場合(私はオンライン読んで理解した内容から)TClassD
がinteger
です。デルファイでは、これも法的です:
type
TClassC<T> = class
private
type
TClassD<T> = class // <-- note the <T> repeated!!
private
x: T;
end;
end;
現在はどうなっていますか? をTClassD
に再度宣言できれば、これは<T>
がなければTClassD
クラスではないことを意味します。私は正しいですか?
これをチェックするのは簡単なはずですが、このコードをコンパイルすると内側のTが外側のものを隠すことが予想されます。つまり、内部の型パラメータに別の名前を使用したのと同じです。 'TClassC'や 'TClassD 'のようなものです。 –
言い換えれば、私の期待は、Delphiコードが、パラメータ名が衝突しないC++バージョンとまったく同じように動作することです。しかし、C++言語は名前の衝突からあなたを守ります。 –
あなたの最初のC++の例では、 'D'自体がテンプレートクラスではなく、' C'のテンプレートは範囲内にあり、 'D'はそれを使用できます。あなたの2番目のC++の例では、 'T 'という名前の2つのテンプレートパラメータを持つことは、実際には名前の競合です。なぜならC++は同じスコープ内で繰り返し識別子を好きではないからです。 Delphiジェネリックスは、C++テンプレートと同じ構文ではありません(同様の構文を使用していても)、DelphiはC++よりもこの特定の例で少し柔軟です。 –