Lazarus报Anonymous Class definitions are not allowed错误求解
报错原因
这个错误不是Free Pascal编译器抛出的,是Lazarus IDE自带的CodeTools模块(负责代码补全、窗体组件解析的核心模块)的解析bug:你直接内联声明array of Class of TKarte类型的数组时,CodeTools会把这种内联写法误识别成匿名类定义,才会弹出"Anonymous Class definitions are not allowed"的提示。这也是为什么程序本身可以正常编译运行,只有触发IDE相关功能(添加新组件、按Ctrl+Space唤起补全)的时候才会报错。
修复方案
不要内联写类引用类型的数组,先显式定义命名的类引用类型,再用这个类型声明数组即可,步骤如下:
- 第一步:在
Karten单元的type区块,或是你声明Hand变量所在单元的type区块,新增TKarte对应的类引用类型定义:
type TKarteClass = class of TKarte;
- 第二步:把原来的Hand数组声明替换成基于上述显式类型的写法:
Hand: array of TKarteClass;
修改完成后,你之前写的数组扩容、添加卡牌类引用、调用虚方法的代码完全不需要改动,运行逻辑和之前完全一致,IDE的代码补全、组件添加功能也不会再抛出该错误。
额外说明
你最初的内联写法从Free Pascal语法规则层面是完全合法的,出问题纯粹是Lazarus的CodeTools模块对内联类引用数组的解析支持不完善。显式命名类引用类型是Lazarus环境下开发的通用兼容写法,后续如果需要给类引用扩展其他通用处理逻辑也会更方便。
内容的提问来源于stack exchange,提问作者Boi
相关产品推荐
相关产品推荐

