2015-12-28 14 views
6

Mentre imparavo e sperimentavo con i modelli, mi sono imbattuto in qualcosa che non riuscivo a comprendere pienamente.Come vengono risolti/dedotti gli argomenti dei template?

class sample 
{ 
    public: 
     sample(int a = 0) {} 
}; 

template <typename T1,typename T2> 
void add(T1 a) // Replace T1 with T2 resolves compilation error. 
{} 

int main() 
{ 
    add<sample>(3); 
    return 0; 
} 

Il codice sopra riportato genera errore di compilazione (sia 03 che C++ 0x). Ma quando cambio il tipo di argomento di add da T1 a T2, è ok. Con nm, il prototipo creato è add (sample, int) [T1 = sample, T2 = int]. Perché la compilazione fallisce con T1 come tipo di argomento ma non T2?

risposta

6

Esistono due modi per specificare gli argomenti del modello: esplicitamente o implicitamente.

Questo sarebbe esplicito:

template<typename T> 
void do_something(T value) {}; 

do_something<float>(6); // T is float 

questo sarebbe implicita:

int x; 

do_something(x); // since first argument is T and x is int, T is int 

Nel tuo caso:

template <typename T1,typename T2> void add(T1 a); 
add<sample>(3); // T1 is explcitly sample, T2 is unknown 

Caso 2:

template <typename T1,typename T2> void add(T2 a); 
add<sample>(3); // T1 is explcitly sample, T2 is implicitly int 
1

Questo perché la classe sample può essere creata in modo implicito da int. Pertanto, quando si specifica <sample> come argomento di tipo, int corrisponde al primo parametro, di tipo <sample>, implicitamente, ma T2 non è definito in quanto non può essere dedotto da alcun tipo.

Questo non accade nel secondo caso, perché allora si specificano parzialmente i tipi: <sample> specifica il tipo di T1, ed un int può quindi dedurre per T2, ei tipi di modello sono tutti dedotte. Anche se tutti i tipi non sono usati, va bene.

Problemi correlati