2010-04-19 4 views
7

Ich habe den folgenden Code:Warum werden Operator-Konvertierungen nicht implizit für Template-Funktionen aufgerufen? (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); 
} 

Wenn ich den Code zu kompilieren mit gcc 4.3.3 ich eine Nachricht bekommen (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’), das anzeigt, dass der Compiler 'operator pointer<const T>' für die Nicht-Template-Funktion f() aufgerufen , aber nicht für die Template-Funktion tf(). Warum und gibt es einen Workaround kurz vor dem Überladen von tf() mit einer const und non-const Version?

Vielen Dank im Voraus für jede Hilfe.

+0

vielleicht entfernt die stackoverflow-Software die spitzen Klammern Ihrer Vorlage? – jonner

Antwort

6

Der Grund dafür ist, dass Sie nicht implizite Typumwandlungen während der Vorlage Abzug bekommen haben, es wird nie zu diesem Punkt.

Bedenken Sie:

template <typename T> 
struct foo {}; 

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

foo<int> f; 
bar(f); 

für diesen Anruf kann der Compiler zu versperren, ableiten, dass U ein int ist, und die Funktion instanziiert. Allerdings betrachtet:

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

foo<int> f; 
bar(f); 

Es gibt keinen U ist der Compiler so ableiten kann, dass die Art von foo den Typ des Parameters übereinstimmt. Ergo, Schabloneninstanziierung schlägt fehl. Es gibt keine Möglichkeit, dass die Konvertierung stattfindet.

+0

Danke. Genau das musste ich wissen. –

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

^Der Compiler wird keine Funktion Aufruf dieser Funktion entsprechen, es sei denn Sie explizit einen Parametertyp an der Funktionsaufruf angeben, da Sie die Type-Name nicht U als Funktionsargument verwenden. Ich vermute, dass Sie so etwas wie zu tun:

template <typename U> 
void tf(pointer<U>); 
Verwandte Themen