次のコードは、gcc と clang で正常にコンパイルされます。
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
オーバーロードの解決が最初のオーバーロード ( identity<T>::type
1 つ) を選択しているようです。
誰かがオーバーロードがあいまいではない理由を説明できますか? 私が知る限り、それらの唯一の違いは、最初の引数は非推定コンテキストであり、2 番目の引数はそうではないということですが、テンプレート引数を明示的に提供しているので、私はしません。なぜそれが重要なのかわかりません。