■
宣言と定義を分けるのが面倒だからという、ただそれだけの理由でテンプレートを使う人間もいる。俺だ。
#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 ; }