このような質問を見て、その理由を尋ねます。クラス A とクラス B の間には、int があるという以上の関係はないようです。
これをコンパイルする方法は、C を A と B のフレンドにするか、少なくとも C の equal 関数を A と B のフレンドにすることです (前方宣言を慎重に使用して)。
class A;
class B;
class C { static bool equal(A const &, B const &); };
class A { friend bool C::equal(A const &, B const &) };
class B { friend bool C::equal(A const &, B const &) };
bool C::equal(A& const &a, B const &b) { return a.a == b.b; }
比較演算子がその入力を変更することを意図している可能性は低いため、const 修飾子に注意してください。さらに、Cのメンバーを使用しないため、静的関数にしました-完全に無関係です。(あなたのスニペットに従って)。
基本的に - それがあなたのやり方です。しかし、よく考えずにそれをしないでください。リンゴとオレンジの両方にピップがあるからといって、ピップの数を比較することに多くの意味があるわけではありません。