宣言と定義を分けるのが面倒だからという、ただそれだけの理由でテンプレートを使う人間もいる。俺だ。

#include <iostream>

template <typename T>
class A {
public:
    typedef T  b_type;
    typedef T* b_pointer;
private:
    b_pointer b_;
public:
    A() : b_(0) {}
    void set_b(b_pointer b) {
        b_ = b;
    }
    int invoke_a() {
        return 1;
    }
    int invoke_b() {
        b_->invoke_b();
    }
};

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

int
main(int, char* []) {

    A<B> 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
        ;
}