2010-04-19 5 views
7

je le code suivant:Pourquoi les conversions d'opérateur ne sont-elles pas implicitement appelées pour des fonctions de modèle? (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); 
} 

Lorsque je compile le code avec gcc 4.3.3 j'obtenir un message (aaa.cc:17: error: no matching function for call to ‘tf(pointer<float>&)’) indiquant que le compilateur appelé 'operator pointer<const T>' pour la fonction non-basé sur un modèle f() , mais n'a pas fait pour la fonction tfated(). Pourquoi et comment contourner tf() avec une version const et non-const?

Merci d'avance pour toute aide.

+0

peut-être que le logiciel stackoverflow supprime les chevrons de votre modèle? – jonner

Répondre

6

La raison en est que vous ne recevez pas les conversions implicites de type lors de la déduction de modèle, il ne fait jamais à ce point.

Tenir compte:

template <typename T> 
struct foo {}; 

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

foo<int> f; 
bar(f); 

Pour cet appel à barre, le compilateur peut en déduire que U est un int et instancier la fonction. Cependant, tenez compte:

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

foo<int> f; 
bar(f); 

Il n'y a pas U le compilateur peut déduire de telle sorte que le type de foo correspond au type du paramètre. Ergo, l'instanciation du modèle échoue. Il n'y a aucune chance que la conversion se produise.

+0

Merci. C'est exactement ce que j'avais besoin de savoir. –

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

^Le compilateur ne correspond pas à un appel de fonction à cette fonction, sauf si vous spécifiez explicitement un type de paramètre à l'appel de fonction, puisque vous n'utilisez pas le typename U comme argument de la fonction. Je suppose que vous voulez faire quelque chose comme:

template <typename U> 
void tf(pointer<U>); 
Questions connexes