2013-06-12 4 views
5

Vorlage abgeleitet schien falsch, warum (c) heißt eher als (b)?Vorlage Abzug scheint falsch

#include <iostream> 
using namespace std; 
template<class T> void f(T){cout << "f(T)";}//(a) 
template<> void f<>(int*){cout << "f(int*)";}//(b) 
template<class T> void f(T*){cout << "f(T*)";}//(c) 
//void f(int*){cout <<"POD:f(int*)";}//(d) 

int main(int argc,char*argv[]) 
{ 
    int p = 1; 
    f(&p); 
    cout <<endl; 
    return 0; 
} 

Ausgang:

f(T*)

+7

See [warum nicht Funktionsschablonen spezialisieren] (http://www.gotw.ca/publications/mill17.htm). – juanchopanza

+1

@jogojapan Ich habe den Titel des Duplikats geändert, um die Frage besser widerzuspiegeln. – juanchopanza

Antwort

3

Ok, lassen Sie uns gerade gesetzt, was wir haben zuerst.

(a) ist eine Funktionsvorlage. (b) ist eine Spezialisierung dieser Funktionsvorlage. (c) ist eine andere Funktionsvorlage, die (a) überlädt.

Wenn Sie f(&p) schreiben, sind zwei Überlastungen zu berücksichtigen: die beiden Funktionsvorlagen (a) und (c). In (c) T* ist spezialisierter als T in (a), also (c) wird ausgewählt.

Jetzt betrachten wir die auskommentierte (d). Dies ist keine Spezialisierung der Funktionsvorlage (a), sondern eine zusätzliche Überlastung. Um den Aufruf f(&p) aufzulösen, müssen jetzt drei Überlastungen berücksichtigt werden. (d) ist keine Vorlage und hat int* passend zum Typ &p, so dass es über die anderen beiden ausgewählt wird.

+0

(bx) wurde bereits im Codenamen (d) :) – yuan

+0

@yuan oh. Meine Augen lasen nur den kommentierten Code. Verdammt, sie sind zu gut trainiert :( –

0

Template-Spezialisierung muss nach der Vorlage erfolgen. Hier, in Ihrem Fall, sieht es wie folgt aus:

template<class T> void f(T){cout << "f(T)";}//(a) // Template 1 
template<> void f<>(int*){cout << "f(int*)";}//(b) // Specialization of template 1 
template<class T> void f(T*){cout << "f(T*)";}//(c) // Template 2, conceals template 1 

Daher erhalten Sie Schablone 2 instanziiert. korrekte Art und Weise toi tun ist:

template<class T> void f(T*){cout << "f(T*)";} // Template 1 
template<class T> void f(T){cout << "f(T)";} // Template 2 
template<> void f<>(int*){cout << "f(int*)";} // Specialization of the template 1 

Ausgabe:

f(int*) 
Verwandte Themen