次の2つのオーバーロードを検討してください
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
1つ目は通常のクラスで機能し、2つ目はインスタンス化されていないテンプレートで機能します。例えば:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
ここで、次のテンプレート関数を考えます。
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
GCCでは、Clangのコンパイル中に、あいまいなオーバーロード解決のエラーが発生します。興味深いことに、test()への2回目の呼び出しではエラーが発生しません(GCCでも)。さらに、template<typename U>
templfunの上にあるものを削除すると、gccは文句を言うのをやめます。
これはGCCのバグですか、それとも違法なコードですか?