さらに別のテンプレートの問題 ! 演算子 << のオーバーロードがある場合にオブジェクトを出力するテンプレート メソッドを取得しようとしています。ほとんどすべてが機能しており、g++ がオブジェクトの種類ごとに目的の特殊化を選択できるようにするために、enable_if を実装しました。
事は、オーバーロードされていないオブジェクトでは、非常にうまく機能します。しかし、オーバーロードされたものでは、両方の専門化が g++ の合理的な選択であり、コンパイルする代わりにあいまいなオーバーロード エラーが出力されます。
コードは次のとおりです。
template<typename T>
static void Print(Stream& out, T& param, typename enable_if<CanPrint<T>::value>::type = 0)
{
out << param;
}
template<typename T>
static void Print(Stream& out, T& param)
{
out << "/!\\" << typeid(param).name() << " does not have any overload for <<.\n";
}
なぜそのようなことが曖昧なのか理解できます。それでも、それをより明確にする方法は考えられません...最初のオーバーロードが選択できない場合にのみ、2番目のオーバーロードが選択されることをコンパイラーに理解させるにはどうすればよいですか?