2010-08-11 173 views
6

在一些代码我固定起来,这使得大量使用泛型和接口类型,我得到错误delphi编译错误E2134是什么意思?

 E2134, Type '<void>' has no type info.

我相信这是因为我在一个重构的中间,其中一些深度嵌套组所有使用泛型的单元都不同步,但错误不会发生在我可以使用错误消息修复代码的地方,因为代码没有问题,错误出现的位置。

这里是上下文,嘲笑,因为我不能发布的代码中,有太多:

unit GenericThing; 
... 
interface 
... 
type 
... 
IThingListOf<ThingT> = interface(IThingContainer) 
    function getEnumerator: TEnumerator<ThingT>; 
    function getCount: Integer; 
    function getThing(Index: integer): ThingT; 
    function getFirst: ThingT; 
     function IndexOf(value: ThingT): integer; 
    function addItem(const Thing: ThingT): ThingT; 
     function removeItem(const Thing: ThingT): Integer; 
    procedure clear; 
    procedure Sort; overload; 
    procedure Sort(const AComparer: IComparer<ThingT>); overload; 
    property Count: integer read getCount; 
    property First: ThingT read getFirst; 
    property Items[Index: integer]: ThingT read getThing; default; 
    end; 

// error appears on whatever line number comes after the declaration of IThingListOf<ThingT>...end; 
    function AnythingYouLikeHere:Integer; // there is nothign wrong with this line, but you get the E2134 here. 

看来,问题出在IThingContainer本身:

IThingContainer = interface ... 
     ... 
     procedure DoSomething(const Param); 
    end; 

的在“const Param”之上没有类型信息。在我看来,这是一个奇怪的(腋下)帕斯卡尔/德尔福,你完全违反了沃斯的强打字理念。它与C中的“void *”指针类似,或Delphi中的“指针”类型,但除了像标准的pre-object-pascal RTL函数(如Move)之类的地方,它很少被使用上。在我看来,在泛型中使用的接口中的非类型化参数应该允许或不允许,但有时不允许,并且不允许其他时间。

这是1978年从2009年开始

回答

15

错误消息表示没有可用于给定类型的类型信息。

这里的一个最小的程序产生的信息:

type 
    {$M+} 
    IThing = interface 
    procedure P(const X); 
    end; 
    {$M-} 
begin 
end. 

的问题,它会出现,是IThingListOf<>,或其祖先之一,用{$M+}活性编译。编译器从这里推测你确实是想要接口的完整类型信息;最初它被SOAP等支持用于生成存根等。接口RTTI不支持无类型参数(在逻辑上足够了,它们不能被SOAP等整理) - 并且它们显示为void类型,并且你最终得到这个错误信息。

解决方案是要么不使用{$M+}--尽管推测RTTI正在被使用,否则它不会被启用 - 或者使用而是改为Pointer,并明确传递地址。

+0

BRILLIANT。谢谢。 – 2010-08-11 18:33:52

1

这是有点难以从这一说,与ObjectPascal功能严重混合尤其是没有IThingContainer可用的定义帕斯卡尔功能的情况。如果你将界面定义评论出来,它是否会编译过去那一点?很明显,当你尝试创建一个实现了该接口的类时,它会中断,但是它会修复这个问题吗?

如果是这样,那么编译器就会在接口定义中窒息。尝试对其中的部分内容进行评论以找出问题所在。如果没有,那么你必须去别的地方看看。

+0

它似乎只在IThingContainer定义包含函数中的非类型化参数的接口方法时才会发生。真奇怪的是,有时候你可以在函数中定义无类型的参数,有时你不能。我正在查看使用非类型化参数的代码库。将IThingContainer中的所有参数更改为输入可修复问题,但我无法找到为什么会发生这种情况。 – 2010-08-11 16:47:24