クラスが相互に依存している場合、インライン関数の宣言と定義を分けなければいけない。たとえば、A::invoke_b() のように。

#include <iostream>

class A;
class B;

class A {
    B* b_;
public:
    A() : b_(0) {}
    void set_b(B* b) {
        b_ = b;
    }
    int invoke_a() {
        return 1;
    }
    int invoke_b();
};

class B {
    A* a_;
public:
    B() : a_(0) {}
    void set_a(A* a) {
        a_ = a;
    }
    int invoke_a() {
        a_->invoke_a();
    }
    int invoke_b() {
        return 2;
    }
};

inline int A::invoke_b() {
    return b_->invoke_b();
}

int
main(int, char* []) {

    A a;
    B b;

    a.set_b(&b);                                                           
    b.set_a(&a);

    std::cout
        << a.invoke_a() << std::endl
        << a.invoke_b() << std::endl
        << b.invoke_a() << std::endl
        << b.invoke_b() << std::endl
        ;
}