なんとか原因突き止めました。
>とありますが、戻り値も引数も全く同じなのにこのエラーが発生しました。
嘘でした(汗

class LObject
{
private:
public:
 LObject(){}
 ~LObject(){}
 virtual void print(std::ostream& a_ost) const;
 // ↓コイツのせい
 virtual const LBoolean& operator= (const LNil& a_nil);
};

class LNil : public LObject
{
private:
public:
 LNil(){}
 ~LNil(){}
 void print(std::ostream& a_ost) const{
  a_ost << "nil" << std::endl;
 }
 // ↓こんなのが暗黙の内に入れられるのかな
 // const LNil& operator= (const LNil& a_nil);
};

LNil::operator=は勝手にオーバーライドされてしまうのですね。
LNilではoperator=不要なので、どうにかなりませんかね?