2010-02-23 6 views
3

Delphi 2006 a introduit la surcharge des opérateurs qui a ensuite été en Delphi 2007. sans bogues Ceci est sur Delphi 2007.surcharge Ajouter opérateur pour trois enregistrements étendus

Pourquoi ce qui suit ne compilera pas:

type 
    TFirstRec = record 
    // some stuff 
    end; 

type 
    TSecondRec = record 
    // some stuff 
    end; 

type 
    TThirdRec = record 
    // some stuff 
    class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec; 
end; 

class operator TThirdRec.Add(_a: TFirstRec; _b: TSecondRec): TThirdRec; 
begin 
    // code to initialize Result from the values of _a and _b 
end; 

var 
    a: TFirstRec; 
    b: TSecondRec; 
    c: TThirdRec; 
begin 
    // initialize a and b 

    c := a + b; // <== compile error: "Operator not applicable to this operand type" 
end. 

Depuis que je suis a déclaré un opérateur qui ajoute deux opérandes a de type TFirstRec et b de type TSecondRec résultant dans un TThirdRec, je m'attendrais à ce que cela compile.

(Si vous avez besoin quelque chose de moins abstrait, pensez à TMyDate, TMyTime et TMyDateTime.)

Répondre

2

Quand j'ai essayé de compiler le code Delphi 2009 J'ai l'erreur du compilateur

[Erreur Pascal] Projet1 .dpr (21): E2518 Opérateur 'Ajouter' doit prendre moins un type 'TThirdRec' dans les paramètres

à la ligne

class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec; 

donc la réponse est - au moins un des arguments (_a; _b) doit être de type TThirdRec

+0

Hm, oui, cela semble possible. Malheureusement, comme l'a déjà mentionné gabr, il est impossible de déclarer l'opérateur autrement parce qu'il n'y a pas de déclaration directe des enregistrements. Alors, laquelle de ces deux réponses dois-je accepter? Je suppose, le vôtre, parce qu'il a répondu à la question. Merci. – dummzeuch

+0

Ce n'est pas impossible, du moins pas avec les déclarations que vous avez montrées. Il suffit de déclarer 'TThirdRec' * first *, puis de déclarer l'opérateur' Add' dans 'TSecondRec'. –

+0

Rob, c'est un problème si vous voulez que les opérateurs Add couvrent toutes les combinaisons possibles de ces trois enregistrements (ce qui est un problème en soi car il faudrait écrire 3x3x3 = 27 Add opérateurs). – gabr

1

Serg a raison. Cela ne compile:

program Project51; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

type 
    TThirdRec = record 
    // some stuff 
    end; 

    TFirstRec = record 
    // some stuff 
    end; 

    TSecondRec = record 
    // some stuff 
    class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec; 
    end; 

class operator TSecondRec.Add(_a: TFirstRec; _b: TSecondRec): TThirdRec; 
begin 
    // code to initialize Result from the values of _a and _b 
end; 

var 
    a: TFirstRec; 
    b: TSecondRec; 
    c: TThirdRec; 
begin 
    // initialize a and b 

    c := a + b; // <== compile error: "Operator not applicable to this operand type" 
end. 

Cela peut être un problème si vous devez déclarer Ajouter pour toutes les combinaisons possibles de TFirstRec, TSecondRec et TThirdRec, car il n'y a pas de déclaration en avant pour les dossiers de Delphi.

Questions connexes