Betrachten Sie die 2 folgenden Überlastungen
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
Der erste funktioniert für reguläre Klassen, während der zweite für Vorlagen funktioniert, die nicht instanziiert sind. Zum Beispiel:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
Betrachten Sie nun die folgende Vorlagenfunktion:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
In GCC gibt es einen Fehler für die mehrdeutige Überlastungsauflösung, während Clang kompiliert. Interessanterweise führt der zweite Aufruf von test () nicht zu Fehlern (auch nicht in GCC). Wenn ich das template<typename U>
Ding über Templfun entferne, hört gcc außerdem auf, sich zu beschweren.
Ist das ein Fehler mit GCC oder ist es illegaler Code?