Template Zweifel in C ++

7
%Vor%

Im obigen Snippet ruft test<int()>() die erste Version auf und gibt die Ausgabe

aus

Called from template T

Warum wird die zweite Version nicht aufgerufen?

    
Rahul Garg 25.09.2010, 05:33
quelle

4 Antworten

11

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.

    
Prasoon Saurav 25.09.2010 05:35
quelle
9

Versuchen Sie:

%Vor%     
tyms 25.09.2010 05:54
quelle
5

Es ist mir nicht ganz klar, was Sie damit erreichen wollen. Wenn Sie jedoch eine andere Vorlagenspezialisierung verwenden möchten, wenn Sie die Vorlage mit einem int statt mit einem anderen Typ instanziieren, ist dies die Syntax, die Sie benötigen -

%Vor%     
jcoder 25.09.2010 09:07
quelle
1

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.

    
sbi 25.09.2010 10:13
quelle

Tags und Links