Es gibt einige Situationen, in denen eine Vorlage immer ungültig ist, unabhängig davon, welche Vorlage Argumente geliefert werden, aber der Compiler ist nicht in der Lage, dass, um herauszufinden, weil sie nicht über die Fähigkeit, jeden versuchen ersetzen möglicher Satz von Vorlagenargumenten. Gemäß dem Standard ([temp.res]/8):
Wenn keine gültigen Spezialisierungs für eine Vorlage erzeugt werden, und das Template nicht instanziiert wird, ist die Vorlage schlecht ausgebildet ist, erforderlich ist keine diagnostischen .
Das bedeutet, dass der Compiler intelligent sein darf und beweisen, dass es keine gültige Spezialisierung ist, und ein Übersetzungsfehler erzeugen, aber es wird auch zu sein, nicht intelligent genug, erlaubt, und kein Übersetzungsfehler zu erzeugen. Nachdem die Vorlage instanziiert wurde, muss der Compiler den Fehler natürlich diagnostizieren.
Es ist nicht illegal, den Namen einer Vorlage ohne Vorlagenargumente zu verwenden. Es gibt einige Umstände, unter denen der Compiler Argumente herleiten kann. Zum Beispiel:
template <class T>
void foo(T x);
int main() {
void (*p)(int) = foo; // p points to foo<int>
}
In Ihrem Code, stellt sich heraus, dass Sie Foo
in einem Kontext verwendet habe, in dem die Vorlage Argumente können nicht abgeleitet werden. Wenn die Compiler klüger wären, hätten sie das herausgefunden. Aber die Tatsache, dass sie es nicht geschafft haben, es herauszufinden, bedeutet nicht, dass Ihr Code korrekt ist.
Err ... versuchen Sie, ein "Bar" -Objekt mit diesem Konstruktor zu erstellen, wenn Sie überhaupt können. Dann sagen Sie uns, ob der Compiler den Code akzeptiert. – WhiZTiM
@WhiZTiM es den Code ablehnen.Ich finde es immer noch merkwürdig, dass sich beide Compiler nicht über den Mismatch-Template-Parameter-Typ beschweren. –