2010-08-11 19 views
6

En algún código que estoy arreglando, lo que hace un uso intensivo de los genéricos y tipos interconectados, estoy consiguiendo el error¿Qué significa el error del compilador delphi E2134?

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

Creo que es porque estoy en el medio de una refactor donde un conjunto anidado de las unidades que usan genéricos no están sincronizadas, pero el error no ocurre en un lugar donde pueda usar el mensaje de error para corregir el código, porque no hay nada de malo en el código, en la ubicación donde aparece el error .

Aquí es el contexto, burlado, porque no puedo enviar el código, hay demasiado:

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. 

Parece que el problema está en IThingContainer sí:

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

LA arriba "const Param" no tiene información de tipo. Esto es extraño (axila) de Pascal/Delphi en mi opinión, donde violas por completo la idea de Wirth de escribir fuerte. Es tan débilmente tipeado como un puntero "void *" en C, o el tipo "Pointer" en Delphi, pero rara vez se usa, excepto en lugares como las funciones RTL preobjeto-pascal estándar como Move, y así en. En mi opinión, los parámetros sin tipo en las interfaces, utilizados en los genéricos, deberían permitirse o no, pero no permitirse a veces, y no permitirse otras veces.

Este es un caso de una función a partir de 1978 Pascal mezcla mal con una característica ObjectPascal de 2009.

Respuesta

15

El mensaje de error significa que no hay información de tipo disponible para el tipo dado.

Aquí es un programa mínimo que produce el mensaje:

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

El problema, al parecer, es que IThingListOf<>, o uno de sus antepasados, fue compilado con {$M+} activo. El compilador presume de esto que realmente quiere información de tipo completo para la interfaz; originalmente fue utilizado por SOAP, etc. soporte para producir stubs, etc. La interfaz RTTI no admite parámetros sin tipo (lógicamente, no pueden ser organizados por SOAP, etc.) y se muestran como de tipo vacío, y terminas con este mensaje de error.

La solución es no utilizar {$M+} - aunque presumiblemente se está utilizando el RTTI, de lo contrario no estaría habilitado - o usar, p. Pointer en su lugar, y pasar la dirección explícitamente.

+0

BRILLANTE. Gracias. –

1

Es un poco difícil de decir de esto, sobre todo, sin la definición de IThingContainer disponible. Si comenta la definición de la interfaz, ¿compilará más allá de ese punto? Obviamente, se romperá cuando intente crear una clase que implemente la interfaz, pero ¿se corregirá el problema este problema?

Si es así, entonces el compilador se ahoga en algo en la definición de la interfaz. Intente comentar algunas partes para descubrir dónde está el problema. Si no, entonces tendrás que buscar en otro lado.

+0

Parece suceder solo cuando IThingContainer define métodos de interfaz que contienen parámetros sin tipo en las funciones. Lo que es realmente extraño es que a veces puede definir parámetros sin tipo en las funciones, y algunas veces no puede. Estoy mirando una base de código que usa mucho los parámetros sin tipo.Cambiar todos los parámetros en IThingContainer que se va a escribir soluciona el problema, pero no puedo encontrar nada sobre por qué sucede esto. –

Cuestiones relacionadas