[fpc-pascal] Compile error with published field
Michael Van Canneyt
michael at freepascal.org
Sat Nov 18 15:22:15 CET 2006
On Fri, 17 Nov 2006, Joao Morais wrote:
> Joao Morais wrote:
> > Michael Van Canneyt wrote:
> > >
> > > On Wed, 15 Nov 2006, Joao Morais wrote:
> > >
> > > > Hello,
> > > >
> > > > I have a TPersistent decendant class that causes the following compiling
> > > > error:
> > > >
> > > > "Only class which are compiled in $M+ mode can be published"
> > > >
> > > > This is the inheritance:
> > > >
> > > > TPersistent (Classes unit)
> > > > +-TPressStreamable (PressClasses unit)
> > > > +-TPressSubject (PressSubject unit)
> > > > +-TPressObject (PressSubject unit)
> > > >
> > > > Am I missing something?
> > >
> > > Probably you have a published member in your class which is not a
> > > descendent
> > > of TPersistent. Only TPersistent descendents can be published members of a
> > > class (which in itself must be a TPersistent descendent).
> > >
> > > So, if TPressObject has a published property
> > > Property MyProp : TMyPropClass Read...
> > >
> > > then TMyPropClass must also descend from TPersistent.
> >
> > This is the code:
> >
> > TPressObject = class(TPressSubject)
> > _Id: TPressString;
> > private // <- compiler stops here
> > ...
> >
> > and this is the inheritance:
> >
> > TPersistent (Classes unit)
> > +-TPressStreamable (PressClasses unit)
> > +-TPressSubject (PressSubject unit)
> > +-TPressObject (PressSubject unit)
> > +-TPressAttribute (PressSubject unit)
> > +-TPressString (PressSubject unit)
> >
> > I also tried to move the member to the published area; declared the class
> > under the $M+ directive; but no success. Moving the _Id member to the
> > private area solves the compilation problem.
>
> The problem is - TPressString is a forward declaration and the compiler
> doesn't know that it inherits from TPersistent. Is this the expected behavior?
Yes.
The compiler has no idea that _Id is publishable, and therefor rejects it.
Michael.
More information about the fpc-pascal
mailing list