試してないから動く自信なっしんぐだけど…

bool operator< ( const Base& lhs, const Base& rhs ) {
 return lhs.isLessThanBase( rhs );
}
class Base {
 virtual bool isLessThanBase( const Base& rhs ) const = 0;
};
class D1 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};
class D2 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};

でごっそりとCompareを用意とか。
「ダブルディスパッチ」で検索かけてみると良いと思われ。