更新
元の質問は、私は(下記参照)を同定問題を抱えていました。しかし、私がそこに記述する修正はXE3以降では問題ありませんが、以下のプログラムはXE2でコンパイルされません。したがって、これはXE2ジェネリックコンパイラのバグであると結論づけます。
とにかく、ここでデルファイXE2の回避策です:
{$APPTYPE CONSOLE}
type
IStorageObject = interface(IInterface)
end;
TObjectStorage<T: IStorageObject> = class(TObject)
end;
IKeyStorageObject<TKey> = interface(IStorageObject)
end;
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>, IStorageObject> = class(TObjectStorage<T>)
end;
TImplementingClass<TKey> = class(TInterfacedObject, IStorageObject, IKeyStorageObject<TKey>)
end;
begin
TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create;
end.
オリジナル答え
あなたは、コンパイラのエラーを示した完全なプログラムを提供した場合、それはもっと良かったはず。そのエラーを表示するには、オブジェクトをインスタンス化する必要があります。
しかし、私はあなたの問題を再現したと思います。
TKeyObjectStorage<TKey, T: IKeyStorageObject<TKey>> = ...
TKey
とT
の両方に汎用的な制約が適用されます。だから私は、問題は、このコードがあることであると信じています。今、明らかにあなただけので、あなたが書く必要があります制約がT
に適用する:
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = ...
ここデルファイXE3の変化を、以下のコンパイルの短いプログラムです:
{$APPTYPE CONSOLE}
type
IStorageObject = interface(IInterface)
end;
TObjectStorage<T: IStorageObject> = class(TObject)
end;
IKeyStorageObject<TKey> = interface(IStorageObject)
end;
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = class(TObjectStorage<T>)
end;
TImplementingClass<TKey> = class(TInterfacedObject, IKeyStorageObject<TKey>)
end;
begin
TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create;
end.
このカンマをセミコロンに変更することはかなりのニュアンスです。重要な句読点によるプログラミングは決して楽しいものではありません。つまり、仮パラメータリストのカンマとセミコロンの違いに精通しているので、同じ区別がここに描かれているのは驚くべきことではありません。あなただけの完全に質問を変更しました
Multiple Type Parameters
When you specify constraints, you separate multiple type parameters by semicolons, as you do with a parameter list declaration:
type
TFoo<T: ISerializable; V: IComparable>
Like parameter declarations, multiple type parameters can be grouped together in a comma list to bind to the same constraints:
type
TFoo<S, U: ISerializable> ...
In the example above, S
and U
are both bound to the ISerializable
constraint.
を!!:
documentationはこのことを念頭にあなたをカバーしていますか?そのコンマをセミコロンに置き換えましたか?あなたが投稿したコードはまだエラーを表示するのに十分ではありません。私が提案したものを行い、**完全なプログラム**を投稿してください。私は私の答えでどのようにあなたを示した。 –
このDavidには申し訳ありませんが、私は行いましたが、 '、'はこのエラーを投げず、軽微な見落としに過ぎませんでした。もう一度お試しください。 – Hugie
@Hugie、元の問題から逸脱して質問を変更しないでください。元々問題にあったエラーはすべて問題にとどまる必要があります。問題を示すために最小限のコードでコンソールアプリケーションを作成してください。ペースト**は**のコンソールアプリケーションの質問に。 – Johan