Im obigen Snippet ruft test<int()>()
die erste Version auf und gibt die Ausgabe
Called from template T
Warum wird die zweite Version nicht aufgerufen?
Gemäß ISO C ++ 03 ( Section 14.3/2
)
In einem Template-Argument wird eine Mehrdeutigkeit zwischen einem type-id
und einem Ausdruck in ein type-id
aufgelöst. int()
ist ein type-id
, also wird die erste Version aufgerufen.
Ich denke, Sie wollten, dass die zweite Vorlage aufgerufen wird, wenn T
int
ist. John hat Ihnen gezeigt, wie Sie das tun, und Benoit hat Ihnen gezeigt, was Sie tun müssen, um die zweite Funktion tatsächlich aufzurufen.
Ihr Problem besteht darin, dass Sie mit special test<>()
für einen bestimmten Typ ( int
) mit der völlig falschen Syntax versehentlich eine andere gültige syntaktische Form gefunden haben (Ein bisschen Pech.) Diese zweite Funktionsvorlage verwendet einen sogenannten Nicht-Typ-Vorlagenparameter . Für andere Typen können Sie andere Dinge als Vorlageparameter verwenden. Unter anderem (Funktionen, Templates) können Sie auch Integralkonstanten wie int
verwenden. Hätten Sie versucht, dies beispielsweise mit double
zu tun, wäre der Code nicht kompiliert worden.
Ihre zweite test<>()
Vorlage ist eine Überladung der ersten, die mit konstanten ganzen Zahlen verwendet werden kann. Deshalb würde Benoits test<0>()
kompilieren.
Für eine vollständige Spezialisierung (es gibt keine partielle Spezialisierung für Funktionsvorlagen, es gibt nur eine Überladung; Klassenvorlagen haben jedoch eine teilweise Spezialisierung), Sie müssen immer eine leere Vorlagenparameterliste angeben ( template<>
) und hinter die Kennung test<int>
die zu spezialisierenden Typen setzen.