78168


Delphi10.3 Community Edition
で以下のサンプルをコンパイルするとエラーが表示されます。どう修正すればよいのかお知恵をお貸しください。

<https://github.com/LUXOPHIA/OpenCL>

**エラーメッセージ:**

[code]

    [dcc64 エラー] LUX.Data.List.pas(79): E2604 ジェネリック型を再帰的に使用しています
    
[/code]

**ソースコード:**

[code]

    TListChildr<TOwnere_,TParent_:class> = class( TListChildr<TParent_> )
         private
           type TListChildr_ = TListChildr<TOwnere_,TParent_    >;
                TListParent_ = TListParent<TOwnere_,TListChildr_>;　//＜---ここ
         protected
           ///// アクセス
           function GetOwnere :TOwnere_;
         public
           ///// プロパティ
           property Ownere :TOwnere_ read GetOwnere;
         end;
    
[/code]


CC BY-SA 4.0
2021-07-13T10:30:27.123
78151
2021-07-14T15:07:59.417
2021-07-14T08:58:29.147
3060
47279
question
delphi
Delphi 10.3 でのコンパイル時、”E2604 ジェネリック型を再帰的に使用しています”の対処


ご報告ありがとうございます。作者の中山です。  
知人に調べて頂きましたところ、Delphi 10.3.3 ではコンパイルエラーになり、有償版の Delphi 10.4
では正常にコンパイルできるようでした。ジェネリックスに関する構文解析のバグのようですね。しかし無事に解決策を発見しました。

まず、ご質問のエラーに関しては、以下のように型宣言を関数内に移すことで回避することができました。

>
> <https://github.com/LUXOPHIA/OpenCL/commit/3403f5b4f231b22537b895d4d0d4b98f0ffe1a6f#diff-1d5f28c5715491c43c71cb633b6996cfae79d0589f8f32ce18b9c03f35aaf45b>

すると今度は、`TCLProgra.CreateHandle`メソッド内で、同じく`E2604`エラーが出てしまいました。`TCLContex<TCLSystem_,TCLPlatfo_>`型は他の場所でも多用しているのに、なぜか`TCLProgra`クラス内でのみ利用できないようです。そこで以下のように、継承先である`TCLLibrar`/`TCLExecut`クラスへ実装を移すことで回避しました。

>
> <https://github.com/LUXOPHIA/OpenCL/commit/c00cbab3ed4a3a2cfb1b70c17204b87abfcded51#diff-63e5c515d31b01e3d9ee081bc6a3c9a63ea2175ba7e002a431bc46e5c30d413c>

なお、ついでに色々大幅に改造してしまったので、リポジトリ全体を再度プルして頂けると幸いです。


CC BY-SA 4.0
2021-07-13T22:43:18.897
78168
2021-07-14T15:07:59.417
2021-07-14T15:07:59.417
47281
47281
78151
answer