さらに次の日、Foo型オブジェクトsrcとBar型オブジェクトdstについてtr_pos(src, dst)と
書いたらビルドエラーになったわ;
仕方ないので関数のオーバーロードを使って
 void tr_pos(const Foo& src, Bar& dst) { tr_pos(src, A); tr_pos(A, dst); }
 void tr_pos(const Bar& src, Foo& dst) { tr_pos(src, A); tr_pos(A, dst); }
のようにして解決したんじゃわ
C++はちょっとしたテクニックを要する数学や!とそのときオモタわ

さらに次の日、Foo型同士、およびBar型同士でコピーしたくなったので、
一昨日書いたテンプレートを特殊化したら行けるやろ、と思って
 template<> void tr_pos<Foo>(const Foo& src, const Foo& dst) { ... }
 template<> void tr_pos<Bar>(const Bar& src, const Bar& dst) { ... }
と書いたらコンパイラが一昨日書いたテンプレートではなくて昨日書いた
オーバーロード関数を特殊化しようとしてビルドエラーになるわrz
C++はいろいろ破綻している罠だらけの言語やとそのとき確信したわ;