2010-08-11 3 views
6

내가 제네릭 많이 사용 및 인터페이스 유형을 만드는, 최대 고정하고, 나는 오류델파이 컴파일러 오류 E2134의 의미는 무엇입니까? 일부 코드에서

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

얻고 나는 내가 리팩토링의 중간에이기 때문에 그것을 믿는 곳의 일부 중첩 세트 모든 제네릭을 사용하는 장치는 동기화되지 않지만 오류가 나타나는 위치에서 코드에 문제가 없기 때문에 오류 메시지를 사용하여 코드를 수정할 수있는 곳에서 오류가 발생하지 않습니다 .

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

:

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 자체에 있음을 나타납니다 여기에

내가 코드를 게시 할 수 없기 때문에,이 너무 많이, 조롱 맥락이다 위의 "const Param"에는 유형 정보가 없습니다. 이것은 파스칼/델파이의 이상한 (겨드랑이) 제 견해로, 당신이 완전히 강한 타이핑에 대한 와튼의 생각을 위반하는 것입니다. 이것은 C의 "void *"포인터 나 델파이의 "Pointer"타입처럼 약한 형태이지만, Move와 같은 표준 pre-object-pascal RTL 함수를 제외하고는 거의 사용되지 않습니다. 에. 제네릭에서 사용되는 인터페이스의 유형이 지정되지 않은 매개 변수는 허용되거나 허용되지 않지만 때때로 허용되지 않으며 다른 경우 허용되지 않아야합니다.

특히 사용할 수 IThingContainer의 정의없이 2009 년

답변

15

오류 메시지는 주어진 유형에 사용할 수있는 유형 정보가 없음을 의미합니다. ,

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

문제는,이 나타납니다 활성 {$M+}로 컴파일 된 것을 IThingListOf<>, 또는 그 조상 중 하나입니다 :

여기에 메시지를 생산하는 최소한의 프로그램입니다. 컴파일러는 이것으로 추정합니다 실제로은 인터페이스에 대한 전체 유형 정보를 원합니다. 원래는 SOAP 등에서 스텁 등을 생성하는 데 사용되었습니다. 인터페이스 RTTI는 유형이 지정되지 않은 매개 변수를 논리적으로 충분히 지원하지 않습니다 (SOAP 등으로 마샬링 될 수 없음). 그리고 void 유형으로 표시됩니다. 결국이 오류 메시지가 나타납니다.

해결 방법은 {$M+}을 사용하지 않는 것입니다. RTTI가 사용되고있는 것은 아니지만 그렇지 않으면 활성화되지 않을 것입니다. Pointer 대신 주소를 명시 적으로 전달하십시오.

+0

BRILLIANT. 고맙습니다. –

1

그것은이에서 말을 좀 어렵다에서 오브젝트 파스칼 기능을 심하게 혼합 1978에서 파스칼 기능의 경우입니다. 인터페이스 정의를 주석 처리하면 그 시점을지나 컴파일됩니까? 분명히 인터페이스를 구현하는 클래스를 만들려고 할 때 중단되지만 수정을 주석으로 처리하지 않습니다. 에 문제가 있습니까?

그렇다면 컴파일러가 인터페이스 정의에서 무언가를 질식시킵니다. 문제의 위치를 ​​알아 내기 위해 부분을 주석으로 처리하십시오. 그렇지 않다면 다른 곳을 봐야 할 것입니다.

+0

IThingContainer가 형식화되지 않은 매개 변수를 함수에 포함하는 인터페이스 메서드를 정의 할 때만 나타나는 것처럼 보입니다. 정말 이상한 점은 함수에서 타입이없는 매개 변수를 정의 할 수 있고 때로는 할 수없는 경우가 있다는 것입니다. 타입이 지정되지 않은 매개 변수를 많이 사용하는 코드베이스를보고 있습니다.입력 할 IThingContainer의 모든 매개 변수를 변경하면 문제가 해결되지만이 문제가 발생하는 이유는 찾을 수 없습니다. –

관련 문제