2010-04-19 9 views
7

ho il seguente codice:Perché le conversioni dell'operatore non vengono chiamate in modo implicito per le funzioni basate su modelli? (C++)

template <class T> 
struct pointer 
{ 
    operator pointer<const T>() const; 
}; 


void f(pointer<const float>); 

template <typename U> 
void tf(pointer<const U>); 

void g() 
{ 
    pointer<float> ptr; 
    f(ptr); 
    tf(ptr); 
} 

Quando compilo il codice con gcc 4.3.3 ricevo un messaggio (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’) che indica che il compilatore chiamato 'operator pointer<const T>' per la funzione non template f() , ma non per la funzione di modello tf(). Perché e c'è qualche soluzione per sovraccaricare tf() con una versione const e non-const?

Grazie in anticipo per qualsiasi aiuto.

+0

forse il software StackOverflow sta rimuovendo le parentesi angolari del modello? – jonner

risposta

6

La ragione è che non si ottiene conversioni di tipo implicite nel modello di deduzione, non viene mai a quel punto.

considerare:

template <typename T> 
struct foo {}; 

template <typename U> 
void bar(foo<U>) 
{} 

foo<int> f; 
bar(f); 

per tale chiamata al bar, il compilatore può dedurre che U è un int, e istanziare la funzione. Tuttavia, in considerazione:

template <typename U> 
void bar(foo<const U>) 
{} // note ^^^^ 

foo<int> f; 
bar(f); 

Non c'è U il compilatore può dedurre in modo tale che il tipo di foo corrisponda al tipo di parametro. Ergo, l'istanziazione del modello fallisce. Non c'è possibilità che la conversione avvenga.

+0

Grazie. Questo è esattamente quello che dovevo sapere. –

1
template <typename U> 
void tf(pointer<const float>); 

^Il compilatore non corrisponderà una chiamata di funzione a questa funzione se non si specifica esplicitamente un tipo di parametro alla chiamata di funzione, dal momento che non si utilizza il typename U come argomento di funzione. Ho il sospetto che si vuole fare qualcosa di simile:

template <typename U> 
void tf(pointer<U>); 
Problemi correlati