まとめ: >>323-324の状況において、特殊化は次のように手段を使い分けねばならない

(1) 3日目のtr_pos(Foo, Bar)の追加は、関数テンプレートの特殊化ではエラーになるので関数のオーバーロードで特殊化する必要がある。
 (理由)
 tr_pos(Foo, Bar)は以下の関数テンプレート全てに当てはまってしまい、コンパイラが特殊化対象を特定できない。
 tr_pos<T, U>(T, U), tr_pos<U>(Foo, U), tr_pos(U, Bar)

(2) 4日目のtr_pos(Foo, Foo)の追加は、関数テンプレートを>>327のように型パラメータ<T, U>を全て指定して明示的特殊化するなら逝ける
 (理由)
 関数引数にBarが現れないことから、tr_pos<U>(U, Bar)は特殊化対象から外れる。
 型パラメータ<T, U>を両方明示することにより、tr_pos<U>(Foo, U)も特殊化対象から外れる。
 ==> 残るtr_pos<T, U>(T, U)が特殊化対象の関数テンプレートであるとコンパイラが判断できる。

(3) 一方、4日目のやつを暗黙的特殊化で行おうとするとビルドエラーで失敗する。
 (>>332でも述べたが、上記(1)と同じことになる。

T::get()やU::set()を持たないクラスであるFooやBarを無理やりtr_pos()というシグネチャで他と統一的に扱おうとした結果スゲー薄氷を踏むようなプログラミングになっていた、
ことがわかった、、