I've seen this before. Apparently the compiler stops looking when it finds a function with a matching name in the derived class so it doesn't look to see in the base class if there is a better match.
To fix this you can write:
1 2 3 4 5 6
class Directory : public Entry{
protected:
void to_DirectoryEntry(DirectoryEntry &) const override;
public:
using Entry::to_DirectoryEntry;
};