2016-04-15 11 views
2

Ich habe eine Template-Funktion:Implizite Typumwandlung in C++ Template

template<typename T> 
void fun(T a, T b){ 
     ....... 
} 

int a = 0; 
double b = 1.2; 
f(a, b); 

können konvertiert werden automatisch zu verdoppeln?

+0

Warum wurde die Frage abgelehnt? Es ist eine legitime Frage. – SergeyA

+0

@SergeyA Ich habe nicht downvote (lese es nur jetzt), aber die Frage ist ein bisschen mehrdeutig und erklärt überhaupt keine Begründung. Es wird nicht erklärt, ob 'f (b, a)' 'double' in' int' oder 'int' in' double' konvertieren soll oder nicht kompiliert werden kann. Es erklärt nicht, ob er diese Behandlung auch für 'kurz a; f (a, b) '. Weder welche sind die unterstützten Arten von 'Spaß'. Ich hätte geantwortet "* ja, nutze Spaß (double a, T b) *", aber die Frage hat keine Information darüber, ob das nutzlos ist oder nicht. Nicht genug Grund, um für mich herabzustimmen. Ich werde einfach weitermachen und werde nicht belästigt. –

Antwort

7

kann eine automatische Umwandlung zu einer doppelten werden?

Nein, weil es zwischen fun<int> und fun<double>, wenn herzuleiten die Art der T in template argument deduction mehrdeutig ist.

Sie könnten das Template-Argument explizit angeben, a implizit double umgewandelt zu machen:

int a = 0; 
double b = 1.2; 
fun<double>(a, b); 

oder fügen Sie eine explizite Umwandlung, die Vorlage Argument Abzug zu machen eindeutig:

int a = 0; 
double b = 1.2; 
fun(static_cast<double>(a), b); 
0

Nein, es kippen. Während des Vorlagenabzugs werden keine Konvertierungen durchgeführt. In diesem Fall schließen wir T unabhängig von a und b, int für a und double für b bekommen - da wir T abgeleitet zwei verschiedene Arten sein, das ist ein Abzug Versagen.

Wenn Sie Conversions tun wollen, wäre die einfachste Sache entweder explizit do it yourself:

f(static_cast<double>(a), b); 

Oder explizit die Template-Parameter zu f so zu schaffen, dass kein Abzug geschieht:

f<double>(a, b); 
0

Wenn der Parameter a in den Typ des Parameters b konvertiert werden soll, dann kann die folgende Vorlage anstelle Ihrer verwendet werden:

template<typename Ta, typename T> 
void fun(Ta aTa, T b) { 
    T& a = static_cast<T>(aTa); 
    /* ... a and b have the same type T ... */ 
} 

int a = 0; 
double b = 1.2; 
fun(a, b); // works fine 
Verwandte Themen