2010-08-11 171 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